Quand utiliseriez-vous un List <KeyValuePair <T1, T2 >> au lieu d'un Dictionary <T1, T2>?

95

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?

Corpsekicker
la source

Réponses:

80

Lorsque vous n'avez pas besoin de recherches rapides sur la clé, la gestion de la table de hachage utilisée par Dictionarya une certaine surcharge.

Pavel Minaev
la source
9
L'opération d'insertion de liste est également plus rapide que celle du dictionnaire
Vadym Stetsiak
2
Ses champs sont en lecture seule, mais vous pouvez toujours remplacer l'élément entier dans la liste.
Pavel Minaev
Plus de différences ici
Vinni
62

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.

RCIX
la source
7
+1 Notez que le dictionnaire n'applique pas non plus l'unicité de la valeur!
gdoron soutient Monica
25

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:

  1. Voulez-vous rechercher des éléments concrets dans le dictionnaire?
  2. Voulez-vous que certains champs ne soient pas uniques (par exemple, paires: prénom / nom).
Miroslav Holec
la source
1
Je pense que le point ici est que les clés de dictionnaire doivent être uniques alors que les clés List <KeyValuePair> ne doivent pas être uniques.
Bruno Bieri
5
@BrunoBieri List Les clés <KeyValuePair> peuvent ne pas être uniques
Nikhil Vartak
2
J'ai rectifié votre commentaire vieux de 2 ans, et vous l'avez remarqué. Pas étonnant que SO soit la seule plateforme de questions-réponses la plus fiable et la plus populaire.
Nikhil Vartak
14

La liste serait également utile lorsque vous vous souciez de l'ordre des éléments.

personne
la source
2
SortedDictionary ne couvrirait -il pas cela?
Alex Angas
2
Oui, mais SortedDictionary ne peut pas couvrir l'ordre des valeurs, uniquement les clés.
ConfusedMan
7

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.

d'ici

tjmoore
la source
5

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.

.

Phillip Ngan
la source
3

De http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx :

KeyValuePaircontre DictionaryEntry
[Krzysztof Cwalina]

Nous avons discuté d'un problème avec la mise en œuvre de IEnumerableon Dictionary<K,V>. Quel type doit IEnumerable.GetEnumerator().Current revenir? KeyValuePair<K,V>ou DictionaryEntry? Pareil pour ICollection.CopyTo. Les instances de quel type doivent être copiées dans le tableau?

Nous avons décidé de ce qui suit: IEnumerable et ICollectionles implémentations d'interface seront utilisées KeyValuePair<K,V>comme type d'élément. IDictionarydes membres spécifiques ( GetEnumeratorretournant IDictionaryEnumerator) utiliseront DictionaryEntrycomme type d'élément.

La raison en est que nous sommes en train de faire un changement où IEnumerator<T>cela se prolongerait IEnumerator. Ce serait très étrange si en parcourant la hiérarchie de Dictionary<K,V>-> IEnumerable<T>-> IEnumerable nous changions soudainement le type de l'élément renvoyé par les recenseurs.

Anax
la source