Linq lista list do pojedynczej listy

201

Wygląda na to, że na ten rodzaj odpowiedzi można było już odpowiedzieć, ale nie jestem w stanie go znaleźć.

Moje pytanie jest dość proste: jak mogę to zrobić w jednym poleceniu, aby zamiast konieczności nowej pustej listy, a następnie agregacji w następnym wierszu, mogłem mieć jedno polecenie linq, które wyświetla moją ostateczną listę. szczegóły to lista elementów, z których każda zawiera listę rezydencji, chcę tylko wszystkie rezydencje na płaskiej liście.

var residences = new List<DAL.AppForm_Residences>();
details.Select(d => d.AppForm_Residences).ToList().ForEach(d => residences.AddRange(d));
Jarrett Widman
źródło

Odpowiedzi:

316

Chcesz użyć SelectManymetody rozszerzenia.

var residences = details.SelectMany(d => d.AppForm_Residences).ToList();
Noldorin
źródło
3
Dzięki. @JaredPar ma wybór z niewłaściwego elementu, ale dziękuję obojgu za wskazówki.
Jarrett Widman
51

Użyj SelectMany

var all = residences.SelectMany(x => x.AppForm_Residences);
JaredPar
źródło
35

Oto przykładowy kod dla Ciebie:

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);
}

A wyjście będzie:

1
2
3
4
5
6
11
12
13
14
15
16
Press any key to continue . . .
Wilson Wu
źródło
29

A dla tych, którzy chcą składni wyrażenia zapytania: używasz dwóch z instrukcji

var residences = (from d in details from a in d.AppForm_Residences select a).ToList();
Sean B.
źródło