web-dev-qa-db-fra.com

Comment puis-je obtenir toutes les valeurs d'un dictionnaire <TKey, TValue> en tant que IList <TValue>?

J'ai un dictionnaire suivant:

IDictionary<int, IList<MyClass>> myDictionary 

et je veux obtenir toutes les valeurs du dictionnaire en tant qu'IList ....


Juste pour ajouter un peu de contexte sur la façon dont je me suis retrouvé dans cette situation ...

J'ai une méthode qui me donne une liste de MyClass. J'ai ensuite une autre méthode qui convertit cette liste en un dictionnaire où leur clé est l'identifiant de MyClass. Plus tard ... et sans accès à cette liste d'origine ... J'ai besoin d'obtenir la liste d'origine non groupée de MyClass.


Quand je passe myDictionary.Values.ToList () à une méthode qui prend un IList, j'obtiens une erreur de compilation qui dit qu'il ne peut pas convertir à partir de

System.Collections.Generic.List<System.Collections.Generic.IList<MyClass>> 

à:

System.Collections.Generic.IList<MyClass>

Maintenant, je peux comprendre que son disparu et ajouté chacun des groupes de IList à la nouvelle liste en tant qu'éléments séparés de la liste .... mais dans ce cas, ce n'est pas vraiment ce que je recherche. Je veux juste une liste de toutes les valeurs dans le dictionnaire entier.

Comment puis-je obtenir ce que je recherche sans parcourir chacune des valeurs clés du dictionnaire et créer la liste que je veux?

37
mezoid

En raison de la façon dont un dictionnaire (ou une table de hachage) est géré, c'est ce que vous feriez. En interne, l'implémentation contient des clés, des compartiments (pour la gestion des collisions) et des valeurs. Vous pourriez être en mesure de récupérer la liste de valeurs internes mais vous êtes mieux avec quelque chose comme ceci:

IDictionary<int, IList<MyClass>> dict;
var flattenList = dict.SelectMany( x => x.Value );

Cela devrait faire l'affaire;) SelectMany aplatit le résultat, ce qui signifie que chaque liste est concaténée en une longue séquence (IEnumerable`1).

47
John Leidegren

Remarqué que beaucoup de réponses étaient assez anciennes.

Cela fonctionnera également:

using System.Linq;

dict.Values.ToList();
74
MrProgram

Une variation sur la suggestion de John:

var flattenedValues = dict.Values.SelectMany(x => x);

Si vous en avez besoin dans une liste, vous pouvez bien sûr appeler ToList:

var flattenedList = dict.Values.SelectMany(x => x).ToList();
23
Jon Skeet

Values obtient un ICollection contenant les valeurs de votre dictionnaire. Comme l'implique la définition de votre dictionnaire, il peut être défini comme un ICollection<IList<MyClass>> collection. Donc, si vous voulez vraiment un IList<IList<MyClass>>, utilisez la solution de spacedog .

Si ce que vous voulez vraiment est un "IList" plat, alors il n'y a pas d'autre solution que de parcourir chaque valeur:

IList<MyClass> l=new List<MyClass>();
foreach (IList<MyClass> v in myDictionary.Values)
    l.AddRange(v);

Notez que cela est tellement inefficace que vous devriez réfléchir à nouveau à l'utilisation d'un dictionnaire pour ce que vous essayez d'atteindre.

0
Mac