Travailler avec Hashtable et Dictionary en C #

Microsoft .Net Framework fournit un excellent support pour travailler avec des collections. Les collections sont utilisées pour le stockage et la récupération des données. Vous utilisez des collections dans votre application pour allouer dynamiquement de la mémoire afin de stocker des éléments, puis les récupérer à l'aide d'une clé ou d'un index en cas de besoin. Fondamentalement, une collection représente un ensemble d'objets auxquels vous pouvez accéder en itérant chacun des éléments de la collection.

Hashtable

Les types de l'espace de noms System.Collections stockent les données sous forme d'objets de type Object. Hashtable représente une structure de données qui peut stocker des objets sous forme de paires clé / valeur. Vous pouvez rechercher une valeur dans une instance de la classe Hashtable à l'aide de la clé correspondante. Notez que la clé et la valeur stockées dans une instance Hashtable sont du type objet. Notez que la clé ne peut pas être nulle. Vous pouvez quand même avoir une valeur nulle stockée. La liste de codes suivante illustre comment stocker et récupérer des clés / valeurs à partir d'une instance de Hashtable.

static void Main()

       {

           Hashtable hashTable = new Hashtable();

           hashTable.Add(1, "Joydip");

           hashTable.Add(2, "James");

           hashTable.Add(3, "Steve");

           Console.WriteLine("The key / value pairs are:--");

           foreach (int key in hashTable.Keys)

           {

               Console.WriteLine("Key: "+ key + " Value: "+ hashTable[key].ToString());

           }

           Console.Read();

       }

Vous pouvez également tirer parti de la méthode GetEnumerator () de la classe Hashtable, puis énumérer la collection pour récupérer les paires clé / valeur qui y sont stockées. Voici un extrait de code qui illustre cela.

IDictionaryEnumerator enumerator = hashTable.GetEnumerator();

while (enumerator.MoveNext())

{

Console.WriteLine("Key: " + enumerator.Key.ToString() + " Value: " + enumerator.Value.ToString());

}

Vous pouvez également profiter de la classe DictionaryEntry pour itérer les éléments dans une table de hachage. L'extrait de code suivant illustre comment cela peut être fait.

Hashtable hashTable = new Hashtable();

hashTable.Add(1, "Joydip");

hashTable.Add(2, "James");

hashTable.Add(3, "Steve");

foreach (DictionaryEntry dictionaryEntry in hashTable)

{

   Console.WriteLine("Key: " + dictionaryEntry.Key.ToString() + " Value: " + dictionaryEntry.Value.ToString());

}

La recherche d'un élément dans une table de hachage est plus rapide par rapport à d'autres collections non génériques - comprenons pourquoi. Un enregistrement dans une table de hachage dans des compartiments (chaque compartiment peut contenir plusieurs enregistrements) à l'aide de clés de hachage. La clé de hachage est à son tour générée automatiquement en utilisant un algorithme de hachage. Le MSDN indique: "Lorsqu'un élément est ajouté à la table de hachage, l'élément est placé dans un compartiment en fonction du code de hachage de la clé. Les recherches ultérieures de la clé utilisent le code de hachage de la clé pour rechercher un seul compartiment particulier, réduisant ainsi considérablement le nombre de comparaisons clés nécessaires pour trouver un élément. "

dictionnaire

Certaines des classes importantes de l'espace de noms System.Collections.Generic incluent: List, Queue, HashSet, LinkedList, Stack, LinkedListNode et Dictionary. La classe Dictionary en C # représente une structure de données générique qui peut contenir des clés et des valeurs de données. Par conséquent, vous pouvez stocker des données de tout type dans une instance de dictionnaire.

Notez que tandis que l'interface ICollection étend l'interface IEnumerable, les interfaces IDictionary et IList étendent l'interface ICollection. La classe Dictionary est contenue dans l'espace de noms System.Collections.Generic. En substance, un dictionnaire contient une collection générique de paires clé / valeur. Vous pouvez tirer parti de la méthode Add de la classe Dictionary pour stocker des objets dans une instance Dictionary. Un dictionnaire est plus rapide qu'une table de hachage car il élimine les frais généraux de boxe et de déballage.

L'extrait de code suivant montre comment stocker et récupérer des objets dans une instance de Dictionary.

Dictionary dictionary = new Dictionary();

dictionary.Add(1, "Joydip");

dictionary.Add(2, "James");

dictionary.Add(3, "Steve");

foreach (KeyValuePair kvp in dictionary)

{

Console.WriteLine(kvp.Key.ToString() + " - " + kvp.Value.ToString());

}

La différence fondamentale entre une table de hachage et un dictionnaire est que si le premier n'est pas tapé et nécessite une surcharge de boxe et de décompression, le second ne le fait pas lorsqu'il est tapé. Il y a une autre différence entre eux. Si vous utilisez un indexeur pour récupérer une valeur à partir d'une instance Hashtable et que l'élément n'existe pas, une valeur nulle vous sera renvoyée. Au contraire, si vous essayez de récupérer un élément inexistant d'une instance de Dictionary, une exception sera levée. Notez que ni Hashtable ni Dictionary ne garantiraient la préservation de l'ordre des éléments de la collection.

Alors que la table de hachage est une structure de données faiblement typée, un dictionnaire est une structure fortement typée. Le choix entre une table de hachage et un dictionnaire dépend de la nécessité ou non d'une collection de type sécurisé. Dans la plupart des cas, un dictionnaire est un bon choix. Pour le dire simplement, un dictionnaire est une table de hachage améliorée. J'utilise fréquemment Dictionary sur une table de hachage.