Как получить все элементы из нескольких списков <>? - PullRequest
2 голосов
/ 19 сентября 2011

В C # у меня есть следующие типы:

List<List<mytype>> MyLists;
List<mytype> MainList;

Я хотел бы взять каждый элемент из всего List <> внутри MyList и поместить их в MainList. MainList будет иметь только элементы, состоящие из всех элементов, которые были внутри каждого List <> MyList. Я пробовал следующее, но получаю ошибку о невозможности определить тип:

MyLists.ForEach(list => MainList.AddRange(list.SelectMany(x => x != null)));

Я не был уверен, что поместить в SelectMany (), так как я хочу, чтобы все элементы в списке <>. Эти элементы не должны соответствовать никаким критериям.

Есть предложения, как это можно сделать?

Ответы [ 3 ]

4 голосов
/ 19 сентября 2011
MainList.AddRange(from list in MyLists
                  from element in list
                  select element);

Или, если хотите,

MainList.AddRange(MyLists.SelectMany(list => list));
3 голосов
/ 19 сентября 2011

Для этого требуется всего один SelectMany вызов:

MainList = MyLists.SelectMany(l => l).ToList();

Обратите внимание, что для этого не требуется создавать / инициализировать MainList до этого вызова, поскольку он полностью инициализируется из вызова ToList().


Редактировать:

Поскольку вы включили проверку null, если вам нужно удалить элементы null из вашего списка, вы также можете добавить эту проверку:

MainList = MyLists.SelectMany(l => l.Where(i => i != null)).ToList();

И / или фильтр для целых null списков:

MainList = MyLists
             .Where(l => l != null)
             .SelectMany(l => l.Where(i => i != null))
             .ToList();

Кроме того, если вы хотите добавить элементов к вашему MainList, в отличие от MainList «иметь только элементы» в исходных списках, вы можете использовать AddRange still:

MainList.AddRange(MyLists.SelectMany(l => l));
0 голосов
/ 19 сентября 2011

Другой вариант, более близкий к вашей первоначальной попытке: MyLists.ForEach(list => MainList.AddRange(list));

Другими словами, вам не нужны SelectMany или даже Select, если вы используете ForEach и AddRange.

...