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 Dictionary
ha 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 :
KeyValuePair
controDictionaryEntry
[Krzysztof Cwalina]Abbiamo discusso un problema con l'implementazione di
IEnumerable
onDictionary<K,V>
. Che tipo deveIEnumerable.GetEnumerator().Current
restituire?KeyValuePair<K,V>
oDictionaryEntry
? Lo stesso perICollection.CopyTo
. Istanze di che tipo devono essere copiate nell'array?Abbiamo deciso quanto segue:
IEnumerable
e leICollection
implementazioni dell'interfaccia utilizzerannoKeyValuePair<K,V>
come tipo di elemento.IDictionary
membri specifici (diGetEnumerator
ritornoIDictionaryEnumerator
) utilizzerannoDictionaryEntry
come 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>
->IEnumerable
cambiassimo improvvisamente il tipo di elemento restituito dagli enumeratori.