Acoplar lista en LINQ


314

Tengo una consulta LINQ que regresa IEnumerable<List<int>>pero quiero regresar solo, List<int>así que quiero fusionar todos mis registros en mi IEnumerable<List<int>>solo una matriz.

Ejemplo:

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

Quiero llevar todo mi resultado IEnumerable<List<int>>a solo unoList<int>

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

Solo quiero una matriz [1,2,3,4,5,6,7]

Gracias

Respuestas:


568

Tratar SelectMany()

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

8
Gracias, siempre me olvido de este: sé que está allí, pero solo paso demasiado tiempo buscando en Google cada vez que necesito usarlo. Marcar esta respuesta :-)
BrainSlugs83

Por un tiempo tuve miedo de ser el único que alguna vez necesitó esto. Gracias Mike!
Arnab Chakraborty

77
¿Hay alguna sintaxis alternativa para SelectMany( i => i )? He visto que esta sintaxis se usa mucho, pero parece un uso degenerado de la función de selección, por lo que hubiera esperado que los diseñadores de idiomas presentaran una sintaxis de acceso directo específicamente para listas de listas
Andy

86

Con sintaxis de consulta:

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

Gracias a la sintaxis exacta que estaba buscando, y muchas respuestas SO enumeran algo más detallado.
SilverSideDown

Esto es mucho, mucho mejor que SelectMany. Más claro exactamente qué está pasando en la OMI, ¡gracias por señalar esto!
Bryan Rayner

3
Personalmente, siempre encuentro que la versión de sintaxis de consulta es mucho menos intuitiva que la versión que llama al método. Cuando Resharper ofrece convertir bucles a expresiones LINQ si me da la sintaxis de la consulta, siempre decido deshacer.
bikeman868

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

66
@recursive ¿Qué extrañaron los demás? .ToArray()? - Eso es algo circunstancial, si solo necesita iterar una vez, o si es probable que los elementos cambien, entonces .ToArray()definitivamente no es lo que desea. Pero con los elementos estáticos que vas a enumerar varias veces, .ToList()o .ToArray()darás una mejora en el rendimiento (a costa de un uso de memoria ligeramente mayor, que generalmente es un buen negocio).
BrainSlugs83

2
Presumiblemente, las circunstancias en este caso requieren matrices, ya que eso se especificó en la pregunta.
recursivo el

8
@recursivo, si estamos jugando, el OP dice que necesita regresar List<int>, por .ToList()lo que sería la opción correcta.
MEMark

@MEMark OP también dice "a solo una matriz"
StefanJanssen

12

¿Me gusta esto?

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

11

Si tienes una List<List<int>> kpuedes hacer

List<int> flatList= k.SelectMany( v => v).ToList();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.