Qual è la differenza tra un elenco di KeyValuePair e un dizionario per gli stessi tipi? C'è un momento appropriato per usare l'uno o l'altro?
Qual è la differenza tra un elenco di KeyValuePair e un dizionario per gli stessi tipi? C'è un momento appropriato per usare l'uno o l'altro?
Risposte:
Quando non sono necessarie ricerche rapide sulla chiave, il mantenimento della tabella hash utilizzata da Dictionaryha un certo overhead.
In breve, l'elenco non impone l'unicità della chiave, quindi se hai bisogno di quella semantica, allora è quello che dovresti usare.
Il dizionario è un tipo generico che contiene una raccolta di coppie chiave-valore. Il dizionario è veloce per le operazioni di ricerca, perché utilizza internamente la funzione hash . Ciò significa che tutte le chiavi devono essere univoche nel dizionario .
Considera questi esempi:
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.
Quindi dovresti sempre considerare due almeno due cose:
L'elenco sarebbe utile anche quando ti interessa l'ordine degli articoli.
Oltre alla risposta di Phillip Ngan, SOAP o altro, non è possibile serializzare XML oggetti che implementano IDictionary.
D: Perché non riesco a serializzare le tabelle hash?
R: XmlSerializer non può elaborare classi che implementano l'interfaccia IDictionary. Ciò è stato in parte dovuto a vincoli di pianificazione e in parte a causa del fatto che una tabella hash non ha una controparte nel sistema di tipo XSD. L'unica soluzione è implementare una tabella hash personalizzata che non implementa l'interfaccia IDictionary.
In SOAP webservices for silverlight, abbiamo scoperto che Dictionary's non serialize. Questa sarebbe una situazione in cui useresti un elenco di KeyValuePair su un dizionario.
.
Da http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx :
KeyValuePaircontroDictionaryEntry
[Krzysztof Cwalina]Abbiamo discusso un problema con l'implementazione di
IEnumerableonDictionary<K,V>. Che tipo deveIEnumerable.GetEnumerator().Currentrestituire?KeyValuePair<K,V>oDictionaryEntry? Lo stesso perICollection.CopyTo. Istanze di che tipo devono essere copiate nell'array?Abbiamo deciso quanto segue:
IEnumerablee leICollectionimplementazioni dell'interfaccia utilizzerannoKeyValuePair<K,V>come tipo di elemento.IDictionarymembri specifici (diGetEnumeratorritornoIDictionaryEnumerator) utilizzerannoDictionaryEntrycome tipo di elemento.Il motivo è che siamo in procinto di apportare un cambiamento in cui
IEnumerator<T>si estenderebbeIEnumerator. Sarebbe molto strano se percorrendo la gerarchia daDictionary<K,V>->IEnumerable<T>->IEnumerablecambiassimo improvvisamente il tipo di elemento restituito dagli enumeratori.