Achatar lista no LINQ


314

Eu tenho uma consulta LINQ que retorna, IEnumerable<List<int>>mas eu quero retornar apenas, List<int>então eu quero mesclar todos os meus registros no meu IEnumerable<List<int>>para apenas uma matriz.

Exemplo:

IEnumerable<List<int>> iList = from number in
    (from no in Method() select no) select number;

Eu quero levar todo o meu resultado IEnumerable<List<int>>para apenas umList<int>

Portanto, a partir das matrizes de origem: [1,2,3,4] e [5,6,7]

Eu quero apenas uma matriz [1,2,3,4,5,6,7]

obrigado

Respostas:


568

Experimentar SelectMany()

var result = iList.SelectMany( i => i );

8
Obrigado, eu sempre esqueço este - eu sei que está lá, mas passo muito tempo pesquisando no Google toda vez que preciso usá-lo. Marcando esta resposta como favorita. :-)
BrainSlugs83

Por um tempo, tive medo de ser o único que precisava disso. Graças à mike!
31515 Arnold Chakraborty

7
Existe alguma sintaxe alternativa para SelectMany( i => i )? Eu já vi essa sintaxe muito usada, mas parece um uso degenerado do recurso de seleção, então eu esperava que os designers de linguagem criassem uma sintaxe de atalho especificamente para listas de listas
Andy

86

Com sintaxe de consulta:

var values =
from inner in outer
from value in inner
select value;

Graças à sintaxe exata que eu estava procurando, e muitas respostas para o SO listam algo mais detalhado.
SilverSideDown

Isso é muito, muito melhor que o SelectMany. Mais claro exatamente o que está acontecendo na IMO, obrigado por apontar isso!
Bryan Rayner

3
Pessoalmente, sempre acho a versão da sintaxe da consulta muito menos intuitiva do que a versão da chamada de método. Quando o Resharper se oferece para converter loops para expressões LINQ, se isso me fornecer a sintaxe da consulta, eu sempre desfarei.
precisa saber é o seguinte

23
iList.SelectMany(x => x).ToArray()

6
@recursive O que todo mundo sentiu falta? .ToArray()? - Isso é meio circunstancial - se você só precisa repetir uma vez - ou se os itens provavelmente mudam, então .ToArray()definitivamente não é o que você deseja. Mas com itens estáticos que você irá enumerar várias vezes .ToList()ou .ToArray()melhorará o desempenho (ao custo de um uso de memória um pouco maior, o que geralmente é um bom negócio).
BrainSlugs83

2
Presumivelmente, as circunstâncias neste caso exigem matrizes, pois isso foi especificado na pergunta.
recursivo

8
@ recursivo, se estivermos detalhando, o OP diz que ele precisa retornar List<int>, então .ToList()seria a escolha correta.
MEMark

@MEMark OP também afirma "a uma única variedade"
StefanJanssen

12

Como isso?

var iList = Method().SelectMany(n => n);

11

Se você tem um, List<List<int>> kvocê pode fazer

List<int> flatList= k.SelectMany( v => v).ToList();
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.