




SelectMany - т.е.
IEnumerable<List<string>> someList = ...;
IEnumerable<string> all = someList.SelectMany(x => x);
Затем для каждого элемента в someList используется лямбда «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;
}
}
}
Хотя это несколько упрощено.
Не совсем один вызов метода, но вы должны уметь писать
var concatenated = from list in lists from item in list select item;
Где «списки» - это ваш IEnumerable<List<string>>, а объединенные - это тип IEnumerable<string>.
(Технически это является - единственный вызов метода для SelectMany - просто не похоже, что это все, что я имел в виду под открывающим оператором. Просто хотел прояснить это на случай, если кто-то запутался или прокомментировал - я понял после того, как опубликовал, как это могло быть прочитано).
Сделайте простой метод. Нет необходимости в LINQ:
IEnumerable<string> GetStrings(IEnumerable<List<string>> lists)
{
foreach (List<string> list in lists)
foreach (string item in list)
{
yield return item;
}
}
@Marc: Вы правы, особенно если есть простой "ликовский" способ. Иногда люди просто очень стараются сделать что-то в стиле LINQ и усложняют понимание простых вещей.
Использование выражения LINQ ...
IEnumerable<string> myList = from a in (from b in myBigList
select b)
select a;
... отлично работает. :-)
b будет IEnumerable<string>, а a будет string.
Вот еще одно понимание запроса LINQ.
IEnumerable<string> myStrings =
from a in mySource
from b in a
select b;
Как насчет
myStrings.SelectMany(x => x)
И нет причин не использовать его, если вы используете .NET 3.5 (что мы можем предположить из OP) или C# 3.0 с .NET 2.0 и LinqBridge.