Types collection Hashtable et Dictionary

La classe System.Collections.Hashtable, ainsi que les classes génériques System.Collections.Generic.Dictionary<TKey,TValue> et System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue>, implémentent l'interface System.Collections.IDictionary. La classe générique Dictionary<TKey,TValue> implémente également l'interface générique IDictionary<TKey,TValue>. Par conséquent, chaque élément de ces collections est une paire clé-valeur.

Un objet Hashtable est constitué de compartiments contenant les éléments de la collection. Un compartiment est un sous-groupe virtuel d'éléments dans la Hashtable, ce qui rend la recherche et la récupération plus facile et plus rapide que dans la plupart des collections. Chaque compartiment est associé à un code de hachage qui est généré à l'aide d'une fonction de hachage et qui est basé sur la clé de l'élément.

La classe générique HashSet<T> est une collection non ordonnée destinée à contenir des éléments uniques.

Une fonction de hachage est un algorithme qui retourne un code de hachage numérique basé sur une clé. La clé est la valeur d'une propriété de l'objet stocké. Une fonction de hachage doit toujours retourner le même code de hachage pour la même clé. Il est possible pour une fonction de hachage pour générer le même code de hachage pour deux clés différentes, mais une fonction de hachage qui génère un code de hachage unique pour chaque clé unique produit de meilleures performances lors de la récupération des éléments dans la table de hachage.

Chaque objet qui est utilisé comme un élément dans une table Hashtable doit être en mesure de générer un code de hachage pour lui-même en utilisant une implémentation de la méthode GetHashCode. Cependant, vous pouvez également spécifier une fonction de hachage pour tous les éléments d'une table Hashtable en utilisant un constructeur Hashtable qui accepte une implémentation de IHashCodeProvider comme un de ses paramètres.

Quand un objet est ajouté à une table Hashtable, il est stocké dans le compartiment associé au code de hachage qui correspond au code de hachage de l'objet. Quand une valeur est recherchée dans la Hashtable, le code de hachage est généré pour cette valeur, et le compartiment associé à ce code de hachage est recherché.

Par exemple, une fonction de hachage pour une chaîne peut prendre les codes ASCII de chaque caractère de la chaîne et les additionner pour générer un code de hachage. La chaîne "pique-nique" aurait ainsi un code de hachage différent du code de hachage de la chaîne "basket". Les chaînes "pique-nique" et "basket" seraient donc dans des compartiments différents. Par contre, "ail" et "lia" auraient le même code de hachage et seraient dans le même compartiment.

Les classes Dictionary<TKey,TValue> et ConcurrentDictionary<TKey,TValue> ont les mêmes fonctionnalités que la classe Hashtable. Un dictionnaire Dictionary<TKey,TValue> d'un type spécifique (autre que Object) offre de meilleures performances qu'une table Hashtable pour les types valeur. La raison en est que les éléments de Hashtable sont de type Object. Par conséquent, le boxing et la conversion unboxing se produisent généralement quand vous stockez ou que vous récupérez un type valeur. La classe ConcurrentDictionary<TKey,TValue> doit être utilisée quand plusieurs threads sont susceptibles d’accéder simultanément à la collection.

Voir aussi