Combinando listas em Lambda / LINQ
Pergunta
Se eu tiver variável do tipo IEnumerable<List<string>>
há uma instrução LINQ ou lambda expressão que pode aplicar a ele que irá combinar as listas retornando um IEnumerable<string>
?
Solução
SelectMany -. I
IEnumerable<List<string>> someList = ...;
IEnumerable<string> all = someList.SelectMany(x => x);
Para cada item em someList, este, em seguida, usa o lambda "x => x" para obter um IEnumerable
Estes são então voltou como um bloco contíguo. Essencialmente, SelectMany é algo como (simplificado):
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;
}
}
}
Apesar de que é simplificado um pouco.
Outras dicas
Como cerca
myStrings.SelectMany(x => x)
Não é exatamente uma única chamada de método, mas você deve ser capaz de escrever
var concatenated = from list in lists from item in list select item;
Onde 'listas' é o seu IEnumerable<List<string>>
e concatenado é do tipo IEnumerable<string>
.
(Tecnicamente esta é um método única chamada para SelectMany
-. Ele simplesmente não parece que foi tudo o que eu queria dizer com a declaração de abertura Só queria esclarecer isso no caso de alguém ficou confuso ou comentou -. percebi depois de eu ter postado como ele poderia ter lido)
Faça um método simples. Não há necessidade de LINQ:
IEnumerable<string> GetStrings(IEnumerable<List<string>> lists)
{
foreach (List<string> list in lists)
foreach (string item in list)
{
yield return item;
}
}
Usando a expressão LINQ ...
IEnumerable<string> myList = from a in (from b in myBigList
select b)
select a;
... funciona muito bem. : -)
b
será um IEnumerable<string>
e a
será um string
.
Aqui está uma outra compreensão consulta LINQ.
IEnumerable<string> myStrings =
from a in mySource
from b in a
select b;