Was ist der Unterschied zwischen einer Liste von KeyValuePair und einem Dictionary für die gleichen Typen? Gibt es einen geeigneten Zeitpunkt, um das eine oder das andere zu verwenden?Wann würden Sie eine Liste <KeyValuePair <T1, T2>> anstelle eines Wörterbuchs <T1, T2> verwenden?
Antwort
Wenn Sie keine schnellen Lookups auf Schlüssel benötigen - die von Dictionary
verwendete Hashtabelle hat einen gewissen Overhead.
Kurz gesagt, die Liste erzwingt keine Eindeutigkeit des Schlüssels, also wenn Sie diese semantische brauchen, dann sollten Sie das verwenden.
+1 Beachten Sie, dass das Wörterbuch auch die Eindeutigkeit des Werts nicht erzwingt! – gdoron
Von http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx:
KeyValuePair
gegenDictionaryEntry
[Krzysztof Cwalina]Wir diskutierten ein Problem mit Implementierung von
IEnumerable
aufDictionary<K,V>
. Welcher Typ sollteIEnumerable.GetEnumerator().Current
zurückgeben?KeyValuePair<K,V>
oderDictionaryEntry
? Dasselbe gilt fürICollection.CopyTo
. Instanzen von was Typ sollte in das Array kopiert werden?Wir entschieden uns, die folgenden:
IEnumerable
undICollection
Schnittstelle ImplementierungenKeyValuePair<K,V>
als Elementtyp verwendet wird.IDictionary
Mitglieder (GetEnumerator
RückkehrIDictionaryEnumerator
)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.
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.
.
Die Liste wäre auch nützlich, wenn Sie sich um die Reihenfolge der Elemente kümmern.
Würde [SortedDictionary] (https://msdn.microsoft.com/en-us/library/f7fta44c.aspx) dies nicht abdecken? –
Ja, aber SortedDictionary kann nicht die Reihenfolge der Werte abdecken, nur die Schlüssel. – ConfusedMan
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.
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:
- Haben Sie konkrete Objekte im Wörterbuch suchen?
- Möchten Sie einige Felder haben nicht eindeutig (zum Beispiel Paare: Vorname/Nachname).
Ich denke, der Punkt hier ist, dass Dictionary-Schlüssel eindeutig sein müssen, wo List
@BrunoBieri Liste
@niksofteng Sie sind absolut richtig. Mein Fehler. –
- 1. Konvertierung zwischen Tupel <T1,T2> und KeyValuePair
- 2. C# Konvertieren Func <T1, object> zu Func <T1, T2>
- 3. Wählen Sie ein Wörterbuch <T1, T2> mit LINQ
- 4. Konvertieren Expression <Func <T1,bool>> zu Expression <Func <T2,bool> dynamisch
- 5. Delegierter für eine Aktion < ref T1, T2>
- 6. Arbeiten von std :: map <t1, t2> :: löschen (Iteratorposition)?
- 7. Reflection MemberInfo zu Func <T1, T2>
- 8. sollte nicht std :: pair <T1,T2> trivial Standardkonstruktor haben, wenn T1 und T2 haben?
- 9. für eine alterantive Suche zur Liste <KeyValuePair <string, KeyValuePair <string, string >>>
- 10. Func <T1, TResult> TResult in Aufgabe eingepackt
- 11. Der einfachste Weg, .Contains() auf einer ICollection zu implementieren <Tuple<T1,T2>>
- 12. .net Mvc View <T1> und Viewusercontrol <T2> Verhalten
- 13. In MVC, wann verwenden Sie <%= %> und <% %>?
- 14. Wörterbuch in Liste konvertieren <KeyValuePair>
- 15. konvertieren Hierarchical Dictionary <KeyValuePair <Dokument, Datei >>()
- 16. Rhino Mocks: Kann ich Stub() verwenden, wenn einer meiner Parameter Ausdruck <Func<T1, T2>> ist?
- 17. anfordern Körper List <KeyValuePair <string, string >>
- 18. Wann verwenden Sie die Liste <T>, IEnumerable <T> und ArrayList
- 19. Wenn A <T1,T2> eine Vorlage für den tatsächlichen Typ ist, warum ist typeof (A <,>) zulässig?
- 20. LINQ: IEnumerable <KeyValuePair <Sometype, IEnumerable <OtherType> >> Auswahl
- 21. Kopieren ObservableCollection <myclass> zu ObservableCollection <KeyValuePair <String, Object >>
- 22. gridview binden Dropdownlist zur Liste <KeyValuePair <int, string>>
- 23. Convert IDictionary <T, Aufgabe <bool>> zu IObservable <KeyValuePair <T, bool>>
- 24. GameObject.FindObjectOfType <>() vs GetComponent <>()
- 25. Wie setze ich die Werte auf: KeyValuePair <KeyValuePair <String, String>, int>
- 26. Erneutes Erstellen eines Dictionary von einem IEnumerable <KeyValuePair <>>
- 27. Deserialize KeyValuePair <string, string> Json.Net
- 28. C#: Wie kann Dictionary <K,V> ICollection implementieren <KeyValuePair <K,V>> ohne Add (KeyValuePair <K,V>)?
- 29. Wann sollten <%# ... %> und <%= ... %> verwendet werden?
- 30. InsertAllOnSubmit <TSubEntity> wann zu verwenden?
Auch Liste einfügen Operation ist schneller als die in Dictionary –
Ist KeyValuePair nicht schreibgeschützt? –
Ihre Felder sind schreibgeschützt, Sie können jedoch immer das gesamte Element in der Liste ersetzen. –