2009-02-17 9 views
27

Ich habe folgendes Wörterbuch:Wie bekomme ich alle Werte eines Dictionary <TKey, TValue> als IList <TValue>?

IDictionary<int, IList<MyClass>> myDictionary 

und ich bin zu wollen als IList im Wörterbuch alle Werte erhalten ....


Nur ein wenig Hintergrund hinzufügen wie ich in diese Situation geraten bin ....

Ich habe eine Methode, die mir eine Liste von MyClass bekommt. Ich habe dann eine andere Methode, die diese Liste in ein Wörterbuch konvertiert, wo sie die ID für MyClass ist. Später ... und ohne Zugang zu dieser ursprünglichen Liste ... muss ich die ursprüngliche nicht gruppierte Liste von MyClass erhalten.


Wenn ich pass myDictionary.Values.ToList() ein Verfahren, das eine IList-I-Fehler bekommen einen Compiler nimmt, der sagt, dass es nicht von

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

umwandeln kann:

System.Collections.Generic.IList<MyClass> 

Jetzt kann ich verstehen, dass es gegangen ist und jede der Gruppen von IList der neuen Liste als separate Elemente der Liste hinzugefügt .... aber in diesem Fall ist es nicht wirklich, was ich danach bin. Ich möchte nur eine Liste aller Werte im gesamten Wörterbuch.

Wie kann ich dann das bekommen, wonach ich gesucht habe, ohne jeden der Schlüsselwerte im Wörterbuch durchlaufen zu müssen und die gewünschte Liste zu erstellen?

+1

Ich glaube, Ihre Frage gewesen wäre fein abgestimmt zu sagen: „Ich will einfach nur eine Liste aller Elemente in den Listen, die in einem Wörterbuch des Schlüssel enthalten sind“. Eine Liste aller Werte im Wörterbuch (wonach Sie gefragt haben) ist genau das, was Sie bekommen haben: eine Liste von Listen. –

Antwort

39

Aufgrund der Art und Weise, wie ein Wörterbuch (oder eine Hash-Tabelle) verwaltet wird, würden Sie dies tun. Intern enthält die Implementierung Schlüssel, Buckets (für die Kollisionsverarbeitung) und Werte. Sie könnten in der Lage sein, die interne Werteliste abrufen, aber Sie sind besser mit etwas wie folgt aus:

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

Es sollte den Trick tun;) Select flacht das Ergebnis, das bedeutet, dass jede Liste in eine lange Sequenz verkettet wird (IEnumerable`1).

0

Values erhält eine ICollection mit den Werten Ihres Wörterbuchs. Wie aus der Definition Ihres Wörterbuchs hervorgeht, kann es als eine ICollection<IList<MyClass>> Sammlung definiert werden. Wenn Sie also wirklich eine IList<IList<MyClass>> möchten, verwenden Sie die spacedog Lösung.

Wenn das, was Sie wirklich wollen, ist eine flache `IList‘, dann gibt es keine andere Lösung, als durch jeden Wert Looping:

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

Beachten Sie, dass diese so höchst ineffizient ist, dass man über die Verwendung einer wieder denken sollten Wörterbuch für das, was Sie erreichen möchten.

20

Eine Variation Johns Vorschlag:

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

Wenn Sie diese in einer Liste benötigen, können Sie von ToList natürlich Aufruf:

var flattenedList = dict.Values.SelectMany(x => x).ToList(); 
+0

Ah ja, ich dachte, dass die Values-Eigenschaft nicht über die Schnittstelle IDictionary '2 zugänglich war. –

44

eine Menge Antwort Bemerkt ziemlich alt waren.

Dies wird auch funktionieren:

dict.Values.ToList(); 
+0

Das funktionierte für mich – Ziggler

+0

Sehr einfach, sollte die Antwort zu diesem geändert werden. – rolls

+4

@rolls Nein, weil 'dict.Values.ToList()' nicht dasselbe ist wie 'dict.Values.SelectMany (x => x) 'das Letztere führt zu Listen von Listen, während' SelectMany' das Ergebnis flacht und verkettet Listen in einer einzigen Sequenz. –