Lista de listas de Linq a lista única


201

Parece que este es el tipo de cosas que ya se habrían respondido, pero no puedo encontrarlo.

Mi pregunta es bastante simple, ¿cómo puedo hacer esto en una declaración para que, en lugar de tener que crear una nueva lista vacía y luego agregarla en la siguiente línea, pueda tener una sola declaración linq que genere mi lista final? detalles es una lista de elementos que contienen una lista de residencias, solo quiero todas las residencias en una lista plana.

var residences = new List<DAL.AppForm_Residences>();
details.Select(d => d.AppForm_Residences).ToList().ForEach(d => residences.AddRange(d));

Respuestas:


316

Desea usar el SelectManymétodo de extensión.

var residences = details.SelectMany(d => d.AppForm_Residences).ToList();

3
Gracias. @JaredPar tiene la selección del elemento incorrecto, pero gracias a ambos por su orientación.
Jarrett Widman el

51

Use SelectMany

var all = residences.SelectMany(x => x.AppForm_Residences);

35

Aquí hay un código de muestra para usted:

List<int> listA = new List<int> { 1, 2, 3, 4, 5, 6 };

List<int> listB = new List<int> { 11, 12, 13, 14, 15, 16 };

List<List<int>> listOfLists = new List<List<int>> { listA, listB };

List<int> flattenedList = listOfLists.SelectMany(d => d).ToList();

foreach (int item in flattenedList)
{
    Console.WriteLine(item);
}

Y la salida será:

1
2
3
4
5
6
11
12
13
14
15
16
Press any key to continue . . .

29

Y para aquellos que quieren la sintaxis de expresión de consulta: utiliza dos de las declaraciones

var residences = (from d in details from a in d.AppForm_Residences select a).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.