Liste Linq de listes en liste unique

201

On dirait que c'est le genre de chose à laquelle on aurait déjà répondu, mais je ne peux pas le trouver.

Ma question est assez simple, comment puis-je faire cela dans une seule instruction afin qu'au lieu d'avoir à refaire la liste vide puis à l'agréger sur la ligne suivante, je puisse avoir une seule instruction linq qui génère ma liste finale. les détails sont une liste d'éléments qui contiennent chacun une liste de résidences, je veux juste toutes les résidences dans une liste plate.

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

Réponses:

316

Vous souhaitez utiliser la SelectManyméthode d'extension.

var residences = details.SelectMany(d => d.AppForm_Residences).ToList();
Noldorin
la source
3
Merci. @JaredPar a sélectionné le mauvais élément, mais merci à vous deux pour vos conseils.
Jarrett Widman
51

Utilisez SelectMany

var all = residences.SelectMany(x => x.AppForm_Residences);
JaredPar
la source
35

Voici un exemple de code pour vous:

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

Et le résultat sera:

1
2
3
4
5
6
11
12
13
14
15
16
Press any key to continue . . .
Wilson Wu
la source
29

Et pour ceux qui veulent la syntaxe d'expression de requête: vous utilisez deux instructions from

var residences = (from d in details from a in d.AppForm_Residences select a).ToList();
Sean B
la source