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?
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:
Wenn Sie keine schnelle Suche nach Schlüsseln benötigen, hat die Verwaltung der von verwendeten Hashtabelle Dictionaryeinen gewissen Overhead.
Kurz gesagt, die Liste erzwingt keine Eindeutigkeit des Schlüssels. Wenn Sie also diese Semantik benötigen, sollten Sie diese verwenden.
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:
Die Liste ist auch nützlich, wenn Sie sich um die Reihenfolge der Artikel kümmern.
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.
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.
.
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 diskutiertDictionary<K,V>. Welcher Typ sollteIEnumerable.GetEnumerator().Currentzurückkehren?KeyValuePair<K,V>oderDictionaryEntry? Gleiches gilt fürICollection.CopyTo. Instanzen von welchem Typ sollten in das Array kopiert werden?Wir haben Folgendes entschieden:
IEnumerableundICollectionSchnittstellenimplementierungen werdenKeyValuePair<K,V>als Elementtyp verwendet.IDictionaryBestimmte Mitglieder (GetEnumeratorRückgabeIDictionaryEnumerator) werdenDictionaryEntryals Artikeltyp verwendet.Der Grund dafür ist, dass wir gerade eine Änderung vornehmen,
IEnumerator<T>die sich ausdehnen würdeIEnumerator. Es wäre sehr seltsam, wenn wir die Hierarchie vonDictionary<K,V>->IEnumerable<T>->IEnumerabledurchlaufen würden und plötzlich den Typ des von den Enumeratoren zurückgegebenen Elements ändern würden.