web-dev-qa-db-fra.com

Dictionnaire vs liste

Je suis donc tombé sur un Dictionary<int, int> aujourd'hui au travail. Cela m'a semblé bizarre parce que j'aurais probablement utilisé un List<int> au lieu. Y a-t-il une différence et y aurait-il un cas d'utilisation où une structure serait préférée à l'autre?

30
ZeroDivide

Vous utiliseriez un Dictionary<int, int> si vos index ont une signification particulière en plus du placement positionnel.

L'exemple immédiat qui me vient à l'esprit est le stockage d'une colonne id et d'une colonne int dans une base de données. Par exemple, si vous avez un [person-id] colonne et un [personal-pin] colonne, vous pouvez les mettre dans un Dictionary<int, int>. Par ici pinDict[person-id] vous donne un code PIN, mais l'index est significatif et pas seulement une position dans un List<int>.

Mais vraiment, chaque fois que vous avez deux listes d'entiers liées, cela pourrait être une structure de données appropriée.

33
Kris Harper

Considérez le List comme un tableau et le Dictionary comme un table de hachage . Vous n'utiliseriez le Dictionary que si vous aviez besoin de mapper (ou d'associer) des clés significatives à des valeurs, tandis qu'un List mappe (ou associe) uniquement des positions (ou des indices) à des valeurs.

Par exemple, supposons que vous vouliez enregistrer une association entre l'âge d'une personne et sa taille. Vous pouvez utiliser un Dictionary<int, int> pour mapper l'âge de la personne (un int) à sa taille (un int):

Dictionary<int, int> personHeightMap = new Dictionary<int, int>();

personHeightMap.Add(21, 185);
personHeightMap.Add(31, 174);

int height = personHeightMap.ContainsKey(21) ? personHeightMap[21] : -1;

Ce n'est pas un exemple très utile, mais le fait est que vous ne pourriez pas faire cela avec élégance avec un List car il aurait besoin de stocker ces valeurs positionnellement.

28
Bernard

Sémantiquement, un Dictionary<int, T> et List<T> sont très similaires, les deux sont des conteneurs à accès aléatoire du framework .NET. Pour utiliser une liste en remplacement d'un dictionnaire, vous avez besoin d'une valeur spéciale dans votre type T (comme null) pour représenter les emplacements vides de votre liste. Si T n'est pas un type nullable comme int, vous pouvez utiliser int? à la place, ou si vous vous attendez à stocker des valeurs positives, vous pouvez également utiliser une valeur spéciale comme -1 pour représenter les emplacements vides.

Lequel vous choisirez devrait dépendre de la plage des valeurs clés. Si vos clés dans le Dictionary<int, T> sont dans un intervalle entier, sans beaucoup d'espaces entre eux (par exemple, 80 valeurs sur [0, ... 100]), puis un List<T> sera plus approprié, car l'accès par index est plus rapide, et il y a moins de mémoire et de temps par rapport à un dictionnaire dans ce cas.

Si vos valeurs de clé sont 100 int valeurs d'une plage comme [0, ..., 1000000], alors un List<T> a besoin de mémoire pour contenir 1000000 valeurs de T, où votre dictionnaire n'aura besoin que de mémoire dans un ordre de grandeur d'environ 100 valeurs de T, 100 valeurs d'int (plus quelques frais généraux, en réalité, attendez environ 2 fois la mémoire pour stocker ces 100 clés et valeurs). Dans ce dernier cas, un dictionnaire sera donc plus approprié.

15
Doc Brown

Comment peut-on les considérer comme équivalents?

Le dictionnaire est clairsemé et permet des insertions aléatoires mais rend la traversée dans l'ordre un problème, la liste n'est pas clairsemée et une insertion dans le désordre est coûteuse, elle fournit par nature une traversée dans l'ordre.

Il y aurait très peu de situations où l'une n'était pas dramatiquement supérieure à l'autre.

6
Loren Pechtel

À part: D'autres langages de programmation se réfèrent à ce type de structure de données comme une carte, plutôt qu'un dictionnaire.

Si vos données peuvent être définies de manière significative en tant que paires clé/valeur, un dictionnaire fournira un accès beaucoup plus rapide si vous avez besoin de trouver une valeur à l'aide de sa clé.

Par exemple, supposons que vous ayez une liste de clients. Chaque client comprend des détails tels qu'un nom et une adresse, ainsi qu'un numéro de client unique. Supposons que vous ayez également une liste des commandes en cours de traitement. Chaque commande contiendra des détails sur ce qui est fait et devra inclure le numéro de client de la personne qui l'a commandée.

Lorsqu'une commande est prête à être expédiée, vous devez trouver l'adresse de livraison. Si les clients sont stockés sous forme de liste simple, vous devez rechercher dans la liste entière pour trouver le client avec le bon numéro de client. Au lieu de cela, vous pouvez stocker les clients dans un dictionnaire, avec le numéro de client comme clé. Le dictionnaire vous permet maintenant de retirer le bon client en une seule étape sans aucune recherche.

2
Simon B

Le dictionnaire utilise le hachage pour rechercher les données. Un dictionnaire a d'abord calculé une valeur de hachage pour la clé et cette valeur de hachage conduit au compartiment de données cible. Après cela, chaque élément du compartiment doit être vérifié pour l'égalité. Mais en réalité, la liste sera plus rapide que le dictionnaire lors de la recherche du premier élément car rien à rechercher lors de la première étape. Mais dans la deuxième étape, la liste doit parcourir le premier élément, puis le deuxième élément. Ainsi, à chaque étape, la recherche prend de plus en plus de temps. Plus la liste est grande, plus elle prend de temps.

En savoir plus sur .... Dictionary Vs List avec un exemple.

1
Walshregal