45 votes

Aplatir un dictionnaire de listes C# avec Linq

J'ai un dictionnaire en C# :

 Dictionary<string, List<string>>

Comment puis-je utiliser Linq pour aplatir cela en un List<string> qui contient toutes les listes du dictionnaire ?

Merci!

88voto

Jon Skeet Points 692016

Très facilement:

 var list = dictionary.Values              // To get just the List<string>s
                     .SelectMany(x => x)  // Flatten
                     .ToList();           // Listify

Ici, l' SelectMany prend une séquence d'entrées (les listes qui constituent les valeurs du dictionnaire) et projette chaque entrée dans une autre séquence de sorties - dans ce cas "les éléments de la liste". Il aplatit ensuite cette séquence de séquences en une seule séquence.

11voto

Keith Nicholas Points 20875

comme requête

 var flattened = from p in dictionary
                from s in p.Value
                select s;

ou comme méthodes...

 var flattened = dictionary.SelectMany(p => p.Value);

J'aime cela par rapport à ce que d'autres ont fait car je passe tout le dictionnaire dans la requête Linq plutôt que simplement les valeurs.

7voto

Porges Points 17745

SelectMany est le moyen le plus simple d'aplatir les choses :

 Dictionary.Values.SelectMany(x => x).ToList()

2voto

Julien May Points 961

En supposant que vous ayez une instance appelée dict :

 dict.SelectMany(pair => pair.Value.Select(str => str));

1voto

zmbq Points 18714

Tu devrais essayer quelque chose comme ça :

 dict.Values.Aggregate(new List<String>(), (a, b) => a.Concat(b));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X