2009-10-19 19 views
215

Tengo una consulta LINQ que devuelve IEnumerable<List<int>> pero quiero devolver solo List<int>, por lo que quiero fusionar todo mi registro en mi IEnumerable<List<int>> en una sola matriz.Flatten List en LINQ

Ejemplo:

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

quiero tomar todo mi resultado IEnumerable<List<int>> a una sola List<int>

Por lo tanto, a partir de las matrices de origen: [1,2,3,4] y [5,6 , 7]

quiero sólo una gama [1,2,3,4,5,6,7]

Gracias

Respuesta

386

Trate SelectMany()

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

Gracias, siempre me olvido de éste - Sé que está ahí, pero Simplemente paso demasiado tiempo buscando en Google cada vez que necesito usarlo. Marcando esta respuesta :-) – BrainSlugs83

+0

Por un tiempo tuve miedo de ser el único que necesitaba esto. Gracias Mike! –

+1

¿Hay alguna sintaxis alternativa para 'SelectMany (i => i)'? He visto esta sintaxis utilizada mucho, pero parece un uso degenerado de la función de selección, por lo que esperaba que los diseñadores del lenguaje crearan una sintaxis de acceso directo específicamente para listas de listas – Andy

7

gusta esta?

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

Sí, gracias por su respuesta al –

6

Si usted tiene un List<List<int>> k que puede hacer

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

@recursive ¿Qué hicieron todos los demás? '.ToArray()'? - Eso es algo circunstancial - si solo necesitas iterar una vez - o si es probable que los elementos cambien, entonces '.ToArray()' definitivamente no es lo que quieres. Pero con los elementos estáticos que va a enumerar varias veces, '.ToList()' o '.ToArray()' dará una mejora en el rendimiento (a costa de un uso de memoria ligeramente superior, que suele ser bastante bueno)) – BrainSlugs83

+2

Es de suponer que las circunstancias en este caso requieren matrices, ya que eso se especificó en la pregunta. – recursive

+7

@recursive, si estamos meticulosamente, el OP dice que necesita devolver 'List ', por lo que '.ToList()' sería la elección correcta. – MEMark

70

Con la sintaxis de consulta:

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

+1 para la sintaxis alternativa –

+0

Agradezco la sintaxis exacta que estaba buscando, y tantas respuestas SO enumeran algo más detallado. – SilverSideDown

+0

Esto es mucho, mucho mejor que SelectMany. Más claro exactamente qué está pasando IMO, ¡gracias por señalar esto! –