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

Cédric Boivin
fuente

Respuestas:

568

Tratar SelectMany()

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

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

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