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

Cédric Boivin
fonte

Respostas:

568

Experimentar SelectMany()

var result = iList.SelectMany( i => i );
Mike Two
fonte
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;
recursivo
fonte
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()
Dylan Beattie
fonte
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);
mqp
fonte
11

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

List<int> flatList= k.SelectMany( v => v).ToList();
Daniel
fonte