Объединение списков в Lambda / LINQ - PullRequest
16 голосов
/ 29 сентября 2008

Если у меня есть переменная типа IEnumerable<List<string>>, есть ли оператор LINQ или лямбда-выражение, которое я могу применить к нему, который объединит списки, возвращающие IEnumerable<string>?

Ответы [ 6 ]

33 голосов
/ 29 сентября 2008

SelectMany - т.е.

        IEnumerable<List<string>> someList = ...;
        IEnumerable<string> all = someList.SelectMany(x => x);

Для каждого элемента в someList он использует лямбду "x => x", чтобы получить IEnumerable для внутренних элементов. В этом случае каждый «x» является списком , который уже IEnumerable .

Затем они возвращаются как непрерывный блок. По сути, SelectMany - это что-то вроде (упрощенно):

static IEnumerable<TResult> SelectMany<TSource, TResult>(
    this IEnumerable<TSource> source,
    Func<TSource, IEnumerable<TResult>> selector) {

    foreach(TSource item in source) {
      foreach(TResult result in selector(item)) {
        yield return result;
      }
    }
}

Хотя это несколько упрощено.

7 голосов
/ 30 сентября 2008

Как насчет

myStrings.SelectMany(x => x)
2 голосов
/ 29 сентября 2008

Не совсем один вызов метода, но вы должны быть в состоянии написать

var concatenated = from list in lists from item in list select item;

Где 'lists' - это ваш IEnumerable<List<string>>, а сцепленный имеет тип IEnumerable<string>.

(Технически это является единственным вызовом метода для SelectMany - просто не похоже, что это все, что я имел в виду при открытии. Просто хотел прояснить это на случай, если кто-то запутается или прокомментировал - я понял после того, как опубликовал, как он мог читать).

0 голосов
/ 30 сентября 2008

Вот еще одно понимание запросов LINQ.

IEnumerable<string> myStrings =
  from a in mySource
  from b in a
  select b;
0 голосов
/ 30 сентября 2008

Использование выражения LINQ ...

IEnumerable<string> myList = from a in (from b in myBigList
                                        select b)
                             select a;

... работает просто отлично. : -)

b будет IEnumerable<string>, а a будет string.

0 голосов
/ 29 сентября 2008

Сделай простой метод. Нет необходимости в LINQ:

IEnumerable<string> GetStrings(IEnumerable<List<string>> lists)
{
   foreach (List<string> list in lists)
   foreach (string item in list)
   {
     yield return item;
   }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...