Wann würden Sie eine Liste <KeyValuePair <T1, T2 >> anstelle eines Wörterbuchs <T1, T2> verwenden?

95

Was ist der Unterschied zwischen einer Liste von KeyValuePair und einem Wörterbuch für dieselben Typen? Gibt es einen angemessenen Zeitpunkt, um den einen oder anderen zu benutzen?

Corpsekicker
quelle

Antworten:

80

Wenn Sie keine schnelle Suche nach Schlüsseln benötigen, hat die Verwaltung der von verwendeten Hashtabelle Dictionaryeinen gewissen Overhead.

Pavel Minaev
quelle
9
Auch das Einfügen von Listen ist schneller als das im Wörterbuch
Vadym Stetsiak
2
Die Felder sind schreibgeschützt, Sie können jedoch jederzeit das gesamte Element in der Liste ersetzen.
Pavel Minaev
Weitere Unterschiede hier
Vinni
62

Kurz gesagt, die Liste erzwingt keine Eindeutigkeit des Schlüssels. Wenn Sie also diese Semantik benötigen, sollten Sie diese verwenden.

RCIX
quelle
7
+1 Beachten Sie, dass das Wörterbuch auch die Eindeutigkeit des Werts nicht erzwingt!
Gdoron unterstützt Monica
25

Dictionary ist ein generischer Typ , der eine Sammlung von Schlüssel-Wert-Paaren enthält. Das Wörterbuch ist schnell für Suchvorgänge, da es intern die Hash-Funktion verwendet . Das heißt, alle Schlüssel müssen im Wörterbuch eindeutig sein .

Betrachten Sie diese Beispiele:

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 mindestens zwei Dinge berücksichtigen:

  1. Möchten Sie konkrete Elemente im Wörterbuch suchen?
  2. Möchten Sie, dass einige Felder nicht eindeutig sind (z. B. Paare: Vorname / Nachname)?
Miroslav Holec
quelle
1
Ich denke, der Punkt hier ist, dass Wörterbuchschlüssel eindeutig sein müssen, während List <KeyValuePair> -Schlüssel nicht eindeutig sein dürfen.
Bruno Bieri
5
@ BrunoBieri List <KeyValuePair> Schlüssel sind möglicherweise nicht eindeutig
Nikhil Vartak
2
Ich habe Ihren 2 Jahre alten Kommentar korrigiert, und Sie haben das bemerkt. Kein Wunder, dass SO die einzige vertrauenswürdige und beliebteste Q & A-Plattform ist.
Nikhil Vartak
14

Die Liste ist auch nützlich, wenn Sie sich um die Reihenfolge der Artikel kümmern.

niemand
quelle
2
Würde SortedDictionary dies nicht abdecken?
Alex Angas
2
Ja, aber SortedDictionary kann nicht die Reihenfolge der Werte abdecken, sondern nur die Schlüssel.
ConfusedMan
7

Neben der Antwort von Phillip Ngan, SOAP oder auf andere Weise, können Sie keine Objekte, die IDictionary implementieren, in XML serialisieren.

F: Warum kann ich Hashtabellen nicht serialisieren?

A: Der XmlSerializer kann keine Klassen verarbeiten, die die IDictionary-Schnittstelle implementieren. Dies war teilweise auf Zeitplanbeschränkungen und teilweise auf die Tatsache zurückzuführen, dass eine Hashtabelle kein Gegenstück im XSD-Typsystem hat. Die einzige Lösung besteht darin, eine benutzerdefinierte Hashtabelle zu implementieren, die die IDictionary-Schnittstelle nicht implementiert.

von hier

tjmoore
quelle
5

In SOAP-Webservices für Silverlight haben wir festgestellt, dass Wörterbücher nicht serialisiert werden. Dies wäre eine Situation, in der Sie eine Liste von KeyValuePair über ein Wörterbuch verwenden würden.

.

Phillip Ngan
quelle
3

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

KeyValuePairvs. DictionaryEntry
[Krzysztof Cwalina]

Wir haben ein Problem mit der Implementierung von IEnumerableon diskutiert Dictionary<K,V>. Welcher Typ sollte IEnumerable.GetEnumerator().Current zurückkehren? KeyValuePair<K,V>oder DictionaryEntry? Gleiches gilt für ICollection.CopyTo. Instanzen von welchem ​​Typ sollten in das Array kopiert werden?

Wir haben Folgendes entschieden: IEnumerable und ICollectionSchnittstellenimplementierungen werden KeyValuePair<K,V>als Elementtyp verwendet. IDictionaryBestimmte Mitglieder ( GetEnumeratorRückgabe IDictionaryEnumerator) werden DictionaryEntryals Artikeltyp verwendet.

Der Grund dafür ist, dass wir gerade eine Änderung vornehmen, IEnumerator<T>die sich ausdehnen würde IEnumerator. Es wäre sehr seltsam, wenn wir die Hierarchie von Dictionary<K,V>-> IEnumerable<T>-> IEnumerabledurchlaufen würden und plötzlich den Typ des von den Enumeratoren zurückgegebenen Elements ändern würden.

Eine Axt
quelle