Объединение списков в Lambda/LINQ
Если у меня есть переменная типа IEnumerable<List<string>>
, есть ли инструкция LINQ или лямбда-выражение, которое я могу применить к ней, которая объединит списки, возвращающие IEnumerable<string>
?
Ответы
Ответ 1
SelectMany - i.e.
IEnumerable<List<string>> someList = ...;
IEnumerable<string> all = someList.SelectMany(x => x);
Для каждого элемента в someList это использует lambda "x = > x", чтобы получить IEnumerable <T> для внутренних предметов. В этом случае каждый "x" представляет собой List <T> , который уже является IEnumerable <T> .
Затем они возвращаются как непрерывный блок. По сути, 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;
}
}
}
Хотя это несколько упрощено.
Ответ 2
Как насчет
myStrings.SelectMany(x => x)
Ответ 3
Не совсем один вызов метода, но вы должны иметь возможность писать
var concatenated = from list in lists from item in list select item;
Где "списки" - это ваш IEnumerable<List<string>>
и конкатенированный тип IEnumerable<string>
.
(Технически это единственный вызов метода SelectMany
- он просто не похож на все, что я имел в виду при открытии оператора. Просто хотел прояснить это, если кто-то запутался или прокомментировал - я понял после Я опубликовал, как он мог читать).
Ответ 4
Сделайте простой метод. Нет необходимости в LINQ:
IEnumerable<string> GetStrings(IEnumerable<List<string>> lists)
{
foreach (List<string> list in lists)
foreach (string item in list)
{
yield return item;
}
}
Ответ 5
Использование выражения LINQ...
IEnumerable<string> myList = from a in (from b in myBigList
select b)
select a;
... работает просто отлично.: -)
b
будет IEnumerable<string>
, а a
будет string
.
Ответ 6
Здесь другое понимание запроса LINQ.
IEnumerable<string> myStrings =
from a in mySource
from b in a
select b;