2009-11-20 8 views

Antwort

52

Wenn Sie keine schnellen Lookups auf Schlüssel benötigen - die von Dictionary verwendete Hashtabelle hat einen gewissen Overhead.

+6

Auch Liste einfügen Operation ist schneller als die in Dictionary –

+0

Ist KeyValuePair nicht schreibgeschützt? –

+1

Ihre Felder sind schreibgeschützt, Sie können jedoch immer das gesamte Element in der Liste ersetzen. –

46

Kurz gesagt, die Liste erzwingt keine Eindeutigkeit des Schlüssels, also wenn Sie diese semantische brauchen, dann sollten Sie das verwenden.

+4

+1 Beachten Sie, dass das Wörterbuch auch die Eindeutigkeit des Werts nicht erzwingt! – gdoron

3

Von http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx:

KeyValuePair gegen DictionaryEntry
[Krzysztof Cwalina]

Wir diskutierten ein Problem mit Implementierung von IEnumerable auf Dictionary<K,V>. Welcher Typ sollte IEnumerable.GetEnumerator().Current zurückgeben? KeyValuePair<K,V> oder DictionaryEntry? Dasselbe gilt für ICollection.CopyTo. Instanzen von was Typ sollte in das Array kopiert werden?

Wir entschieden uns, die folgenden: IEnumerable und ICollection Schnittstelle Implementierungen KeyValuePair<K,V> als Elementtyp verwendet wird. IDictionary Mitglieder (GetEnumerator Rückkehr IDictionaryEnumerator) DictionaryEntry als Elementtyp verwendet wird.

Der Grund dafür ist, dass wir in einem Prozess zur Herstellung einer Veränderung sind, wo IEnumerator<T> IEnumerator verlängern würde. Es wäre sehr seltsam wenn die Hierarchie von Fuß Dictionary<K,V> ->IEnumerable<T> ->IEnumerable wir plötzlich verändern die Art des itemreturned von Aufzählungen.

5

In SOAP Webservices für Silverlight haben wir festgestellt, dass Dictionary nicht serialisieren. Dies wäre eine Situation, in der Sie eine Liste von KeyValuePair über ein Dictionary verwenden würden.

.

11

Die Liste wäre auch nützlich, wenn Sie sich um die Reihenfolge der Elemente kümmern.

+2

Würde [SortedDictionary] (https://msdn.microsoft.com/en-us/library/f7fta44c.aspx) dies nicht abdecken? –

+2

Ja, aber SortedDictionary kann nicht die Reihenfolge der Werte abdecken, nur die Schlüssel. – ConfusedMan

7

Zusätzlich zu Phillip Ngans Antwort, SOAP oder anders, können Sie Objekte, die IDictionary implementieren, nicht serialisieren.

F: Warum kann ich keine Hashtables serialisieren?

A: Der XmlSerializer kann keine Klassen verarbeiten, die die IDictionary-Schnittstelle implementieren. Dies lag zum einen an Terminplaneinschränkungen und zum anderen daran, dass eine Hashtabelle im XSD-Typsystem kein Gegenstück hat. Die einzige Lösung besteht darin, eine benutzerdefinierte Hashtabelle zu implementieren, die die IDictionary-Schnittstelle nicht implementiert.

from here

12

Wörterbuch ist gattungsgemäßen Art die eine Sammlung von Schlüsselwertpaaren enthält. Das Dictionary ist schnell für Nachschlageoperationen, da intern die Hash-Funktion verwendet. Das heißt, Alle Schlüssel müssen im Dictionary eindeutig sein.

diese Beispiele betrachten:

List<KeyValuePair<int, string>> pairs = new List<KeyValuePair<int, string>>(); 
pairs.Add(new KeyValuePair<int, string>(1, "Miroslav")); 
pairs.Add(new KeyValuePair<int, string>(2, "Naomi")); 
pairs.Add(new KeyValuePair<int, string>(2, "Ingrid")); 

Dictionary<int, string> dict = new Dictionary<int, string>(); 
dict.Add(1, "Miroslav"); 
dict.Add(2, "Naomi"); 
dict.Add(2, "Ingrid"); // System.ArgumentException: An item with the same key has already been added. 

Sie sollten also immer zwei mindestens zwei Dinge berücksichtigen:

  1. Haben Sie konkrete Objekte im Wörterbuch suchen?
  2. Möchten Sie einige Felder haben nicht eindeutig (zum Beispiel Paare: Vorname/Nachname).
+0

Ich denke, der Punkt hier ist, dass Dictionary-Schlüssel eindeutig sein müssen, wo List Schlüssel nicht eindeutig sein müssen. –

+0

@BrunoBieri Liste Schlüssel * kann * nicht eindeutig sein – niksofteng

+0

@niksofteng Sie sind absolut richtig. Mein Fehler. –

Verwandte Themen