Vous devez creuser un peu pour voir comment le dictionnaire est implémenté en C # - Ce n'est pas aussi évident que HashMap (une table de hachage) ou TreeMap (une arborescence triée) (ou ConcurrentSkipListMap - une liste de saut ).
Si vous creusez dans la section "Remarques":
La classe générique Dictionary fournit un mappage d'un ensemble de clés à un ensemble de valeurs. Chaque ajout au dictionnaire se compose d'une valeur et de sa clé associée. La récupération d'une valeur à l'aide de sa clé est très rapide, proche de O (1), car la classe Dictionary est implémentée comme une table de hachage.
Et nous l'avons. C'est une table de hachage . Notez que j'ai lié l'article Wikipédia là-bas - c'est une assez bonne lecture. Vous voudrez peut-être lire la section sur la résolution des collisions. Il est possible d'obtenir un ensemble de données pathologiques où la recherche revient à O (N) (par exemple, tout ce que vous insérez tombe dans la même valeur de hachage ou index dans la table de hachage pour une raison quelconque et vous vous retrouvez avec un sondage linéaire ).
Bien que le dictionnaire soit une solution à usage général, vous ne devez pas contourner les types concrets (tels que le dictionnaire) - vous devez contourner les interfaces. Dans ce cas, cette interface est IDictionary
( docs ). Pour cela, vous êtes parfaitement capable d'écrire votre propre implémentation de dictionnaire qui fait les choses de manière optimale pour les données dont vous disposez.
Quant à l'efficacité de la recherche / contient divers?
- Parcourir une liste non triée: O (N)
- Recherche binaire d'un tableau trié: O (log N)
- Arbre trié: O (log N)
- Table de hachage: O (1)
Pour la plupart des gens, la table de hachage est ce qu'ils veulent.
Vous pouvez trouver que le SortedDictionary est ce que vous voulez à la place:
La SortedDictionary<TKey, TValue>
classe générique est un arbre de recherche binaire avec récupération O (log n), où n est le nombre d'éléments dans le dictionnaire. À cet égard, elle est similaire à la SortedList<TKey, TValue>
classe générique. Les deux classes ont des modèles d'objet similaires et les deux ont une récupération O (log n).
Bien que, encore une fois, si la structure de données ne fonctionne pas idéalement avec vos données, vous disposez des outils (les interfaces) pour pouvoir en écrire un qui fonctionne le mieux pour vos données.
Le dictionnaire lui-même est un type de données abstrait . Vous me donnez un dictionnaire et je sais ce que je peux en faire et tous les outils là-bas pour moi d'utiliser par la nature d'être un dictionnaire. Si vous me donniez une liste de tableaux, je me retrouverais à écrire mon propre code pour rechercher, insérer ou supprimer des éléments de la liste. Cela me fait perdre du temps et signifie également qu'il y a plus de chances pour un bug que je copie le code encore et encore d'un endroit à l'autre.
Data Structures
ce lien wiki peut vous être plus utile