2015-11-18 4 views
0

Если у вас есть вложенное List типа T как таковые:Поиска строки в списке вложенного с помощью LINQ

List<List<T>> foo = new List<List<T>>(); 

И вы предполагаете, что элементы во внутреннем списке столбцы, то, что это самый изящный способ получить строки? Вот что я имею в виду (если вам нужно более подробно):

Добавление элементов (предполагается, что список уже инициализирован)

for (int x = 0; x < 5; x++) 
    for (int y = 5; y < 10; y++) 
     foo[x][y] = y + x; // some weird value 

Так, поэтому, получая столбец является простым (и самой главной причиной, почему я заменили этот метод на двумерную матрицу):

// 5th column 
foo[5]; 

Но как бы вы получили ряд? Я пытался что-то вроде этого (5-я строка):

// 5th row ?? 
foo.Where(sublist => true).Where(item => item.Y == 5); 
// (Assume the objects have a Y property that reflects its coordinate) 

, но кажется, что первый Where оговорка возвращает тип List<List<T>> и не List<T>, как я предполагал.

Таким образом, есть два пути для этого вопроса (либо ответ будет достаточно):

  1. избежать петель, как вы перечислить через все элементы в списке?
  2. Как вы получаете строку, используя любой другой простой метод?

Если все остальное не удается, я мог бы также создать класс для представления этого вложенного списка, но я хотел бы предотвратить это, потому что это будет синглтон.

+0

Мне нравится решение @ juharr, потому что вы хотите 5-ю строку, а не строку со столбцом, имеющим определенное значение. Каждый объект во внутреннем списке не должен содержать номер строки, если номер строки не указан из таблицы базы данных и не соответствует позиции в списке. –

ответ

1

Если вы уверены, что каждый столбец имеет 5 строк, вы можете просто выбрать этот индекс.

var fifthRow = foo.Select(x => x[4]).ToList(); 

Или более безопасным вариантом будет

var fifthRow = foo.Select(x => x.Skip(4).FirstOrDefault()).ToList(); 

Как любой столбец, который не имеет по крайней мере, 5 строк будет производить значение по умолчанию для T.

Обратите внимание, что это будет новый список со значениями этой строки, поэтому он не может использоваться для обновления значений в foo.