Quelle est la différence entre une liste de KeyValuePair et un dictionnaire pour les mêmes types? Y a-t-il un moment approprié pour utiliser l'un ou l'autre?
Quelle est la différence entre une liste de KeyValuePair et un dictionnaire pour les mêmes types? Y a-t-il un moment approprié pour utiliser l'un ou l'autre?
Réponses:
Lorsque vous n'avez pas besoin de recherches rapides sur la clé, la gestion de la table de hachage utilisée par Dictionary
a une certaine surcharge.
En bref, la liste n'applique pas l'unicité de la clé, donc si vous avez besoin de cette sémantique, c'est ce que vous devez utiliser.
Dictionary est un type générique qui contient une collection de paires clé-valeur. Le dictionnaire est rapide pour les opérations de recherche, car il utilise la fonction de hachage en interne . Cela signifie que toutes les clés doivent être uniques dans le dictionnaire .
Considérez ces exemples:
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.
Vous devriez donc toujours considérer deux au moins deux choses:
La liste serait également utile lorsque vous vous souciez de l'ordre des éléments.
Suite à la réponse de Phillip Ngan, SOAP ou autre, vous ne pouvez pas sérialiser XML des objets qui implémentent IDictionary.
Q: Pourquoi ne puis-je pas sérialiser les hashtables?
R: XmlSerializer ne peut pas traiter les classes implémentant l'interface IDictionary. Cela était en partie dû à des contraintes de calendrier et en partie au fait qu'une table de hachage n'a pas d'équivalent dans le système de type XSD. La seule solution consiste à implémenter une table de hachage personnalisée qui n'implémente pas l'interface IDictionary.
Dans les services Web SOAP pour silverlight, nous avons constaté que les dictionnaires ne se sérialisent pas. Ce serait une situation où vous utiliseriez une liste de KeyValuePair sur un dictionnaire.
.
De http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx :
KeyValuePair
contreDictionaryEntry
[Krzysztof Cwalina]Nous avons discuté d'un problème avec la mise en œuvre de
IEnumerable
onDictionary<K,V>
. Quel type doitIEnumerable.GetEnumerator().Current
revenir?KeyValuePair<K,V>
ouDictionaryEntry
? Pareil pourICollection.CopyTo
. Les instances de quel type doivent être copiées dans le tableau?Nous avons décidé de ce qui suit:
IEnumerable
etICollection
les implémentations d'interface seront utiliséesKeyValuePair<K,V>
comme type d'élément.IDictionary
des membres spécifiques (GetEnumerator
retournantIDictionaryEnumerator
) utiliserontDictionaryEntry
comme type d'élément.La raison en est que nous sommes en train de faire un changement où
IEnumerator<T>
cela se prolongeraitIEnumerator
. Ce serait très étrange si en parcourant la hiérarchie deDictionary<K,V>
->IEnumerable<T>
->IEnumerable
nous changions soudainement le type de l'élément renvoyé par les recenseurs.