2009-10-19 16 views
215

Ho una query LINQ che restituisce IEnumerable<List<int>> ma voglio restituire solo List<int> quindi voglio unire tutto il mio record nel mio IEnumerable<List<int>> a un solo array.Lista spianatrice in LINQ

Esempio:

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

voglio prendere tutto il mio risultato IEnumerable<List<int>> ad un solo List<int>

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

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

Grazie

risposta

386

Prova SelectMany()

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

Grazie, mi dimentico sempre questo - so che è lì, ma Passo solo troppo tempo a cercare su Google ogni volta che ho bisogno di usarlo. Aggiungi questa risposta ai segnalibri. :-) – BrainSlugs83

+0

Per un po 'ho avuto paura di essere l'unico a averne mai avuto bisogno. Grazie Mike! –

+1

C'è qualche sintassi alternativa per 'SelectMany (i => i)'? Ho notato che questa sintassi è molto utilizzata ma sembra un uso degenerato della funzione di selezione, quindi mi sarei aspettato che i progettisti linguistici presentassero una sintassi di collegamento specifica per gli elenchi di elenchi – Andy

7

Ti piace?

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

Sì, grazie per la risposta a –

6

Se si dispone di un List<List<int>> k si può fare

List<int> flatList= k.SelectMany(v => v).ToList(); 
19
iList.SelectMany(x => x).ToArray() 
+6

@recursive Cosa hanno mancato gli altri? '.ToArray()'? - Questo è un po 'di circostanza - se hai solo bisogno di iterare una volta - o se è probabile che gli elementi cambino, allora '.ToArray()' non è sicuramente quello che vuoi. Ma con oggetti statici che andrete a enumerare più volte, '.ToList()' o '.ToArray()' darà un miglioramento delle prestazioni (al costo di un utilizzo della memoria leggermente più alto, che di solito è un buon affare). – BrainSlugs83

+2

Presumibilmente le circostanze in questo caso richiedono array, poiché è stato specificato nella domanda. – recursive

+7

@recursive, se stiamo facendo il pignolo, l'OP dice che deve restituire 'Lista ', quindi '.ToList()' sarebbe la scelta corretta. – MEMark

70

Con sintassi di query:

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

+1 per la sintassi alternativa –

+0

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

+0

Questo è molto, molto meglio di SelectMany. Più chiaro esattamente cosa sta succedendo all'IMO, grazie per averlo indicato! –

Problemi correlati