Appiattisci elenco in LINQ


314

Ho una query LINQ che ritorna IEnumerable<List<int>>ma voglio restituire solo List<int>quindi voglio unire tutti i miei record nel mio IEnumerable<List<int>>in un solo array.

Esempio :

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

Voglio portare tutto il mio risultato IEnumerable<List<int>>ad uno soloList<int>

Quindi, dalle matrici di origine: [1,2,3,4] e [5,6,7]

Voglio solo un array [1,2,3,4,5,6,7]

Grazie

Risposte:


568

Provare SelectMany()

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

8
Grazie, lo dimentico sempre - so che è lì, ma passo troppo tempo a cercarlo su Google ogni volta che devo usarlo. Aggiungi questa risposta ai segnalibri. :-)
BrainSlugs83

Per un po 'ho avuto paura di essere stato l'unico a averne mai avuto bisogno. Grazie Mike!
Arnab Chakraborty,

7
Esiste una sintassi alternativa per SelectMany( i => i )? Ho visto che questa sintassi ha usato molto, ma sembra un uso degenerato della funzione select, quindi mi sarei aspettato che i progettisti del linguaggio trovassero una sintassi di scelta rapida specifica per gli elenchi di elenchi
Andy

86

Con la sintassi della query:

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

Grazie alla sintassi esatta che stavo cercando, e così tante risposte SO elencano qualcos'altro più dettagliato.
SilverSideDown

Questo è molto, molto meglio di SelectMany. Più chiaro esattamente cosa sta succedendo IMO, grazie per averlo sottolineato!
Bryan Rayner,

3
Personalmente trovo sempre la versione della sintassi della query molto meno intuitiva della versione che chiama il metodo. Quando Resharper si offre di convertire i loop in espressioni LINQ se mi dà la sintassi della query, vado sempre per annullare.
bikeman868,

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

6
@recursive Che cosa hanno perso tutti gli altri? .ToArray()? - È un po 'circostanziale - se hai bisogno di iterare solo una volta - o se è probabile che gli elementi cambino, allora .ToArray()sicuramente non è quello che vuoi. Ma con gli articoli statici che verranno enumerati più volte .ToList()o .ToArray()che miglioreranno le prestazioni (a scapito dell'utilizzo della memoria leggermente più elevato, che di solito è un buon affare).
BrainSlugs83,

2
Presumibilmente le circostanze in questo caso richiedono array, poiché ciò è stato specificato nella domanda.
ricorsivo il

8
@recursive, se stiamo puntando, l'OP dice che deve tornare List<int>, quindi .ToList()sarebbe la scelta giusta.
MEMark

@MEMark OP afferma anche "solo un array"
StefanJanssen,

12

Come questo?

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

11

Se ne hai uno List<List<int>> kpuoi farlo

List<int> flatList= k.SelectMany( v => v).ToList();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.