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));
Jarrett Widman
fuente

Respuestas:

316

Desea usar el SelectManymétodo de extensión.

var residences = details.SelectMany(d => d.AppForm_Residences).ToList();
Noldorin
fuente
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);
JaredPar
fuente
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 . . .
Wilson Wu
fuente
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();
Sean B
fuente