2010-12-29 19 views
34

Ich weiß, dass es möglich ist, eine Liste von KeyValuePair in ein Dictionary zu konvertieren, aber gibt es einen schnellen Weg (neben dem manuellen Durchschleifen), um die umgekehrte Operation auszuführen?Wörterbuch in Liste konvertieren <KeyValuePair>

Dies würde die manuelle Art und Weise,

foreach (KeyValuePair<double,double> p in dict) 
{ 
    list.Add(new KeyValuePair<double,double>(p.Key,p.Value)); 
} 

Nicht wirklich so schlimm sein, aber ich war nur neugierig.

+2

Sie müssen nicht neue KeyValuePairs erstellen; das ist viel einfacher: 'foreach (KeyValuePair p in dict) {list.Add (p); } ' – phoog

Antwort

79

konvertieren ein Dictionary<TKey, TValue> zu einem List<KeyValuePair<TKey, TValue>> Sie nur

var list = dictionary.ToList(); 

oder ausführlichere

var list = dictionary.ToList<KeyValuePair<TKey, TValue>>(); 

IEnumerable<KeyValuePair<TKey, TValue>> Dies liegt daran, Dictionary<TKey, TValue> implementiert sagen kann.

+8

Es ist vielleicht erwähnenswert, dass Sie' System.Linq; 'als Verwendung hinzufügen müssen. – Harry

+1

Dies sollte als Antwort markiert werden –

8

Mit Linq:

myDict.ToList<KeyValuePair<double, double>>(); 

Wörterbuch Elemente KeyValuePair Artikel sind.

5

Wie Jason sagte. Aber wenn Sie nicht wirklich eine Liste benötigen, können Sie sie einfach in eine ICollection < TKey, TValue > umwandeln, weil sie diese Schnittstelle implementiert, aber einige Teile nur explizit. Diese Methode funktioniert besser, weil sie nicht die gesamte Liste kopiert, sondern nur dieselbe Wörterbuchinstanz verwendet.

+0

'ToList' kopiert nur die Verweise auf die Wörterbuchelemente. Dies ist unglaublich schnell und höchst unwahrscheinlich, dass es sich um ein relevantes Leistungsproblem handelt. – jason

+2

Casting ist unendlich schneller. Was sich nicht bemerkbar macht, wenn Sie es nur ein paar Mal mit kleinen Listen machen, aber trotzdem ist es sehr wichtig. – fejesjoco

+1

@Jason: Nicht wahr. Ein Aufruf der Erweiterungsmethode Enumerable.ToList > ist möglicherweise teuer. Aus einer anderen Perspektive muss es eine neue Liste zurückgeben, sonst könnten Sie Elemente zum Wörterbuch hinzufügen, indem Sie Elemente zur Liste hinzufügen, was komisch wäre. – JBSnorro

0

Für .NET 2.0:

Dictionary<TKey, TValue> dictionary = new Dictionary<TKey, TValue>(); 
List<KeyValuePair<TKey, TValue>> myList = new List<KeyValuePair<TKey, TValue>>(dictionary); 
0

Ich habe versucht worden, eine Instanz von Exception.Data aufzählen, die ein IDictionary ist. Dies ist, was schließlich funktioniert:

ICollection keys = idict.Keys; 
    foreach(var key in keys) 
    { 
     var value = idict[key]; 
     Console.WriteLine("{0}: {1}", key, value); 
    } 
Verwandte Themen