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>?

Foi útil?

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 para os itens internos. Neste caso, cada "x" é um List , que já é 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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top