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?

Antworten:


80

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


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.


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)?

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.


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


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.

.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.