Dictionnaire vs Hashtable en C#

Haider Ali 12 octobre 2023
  1. Dictionnaire en C#
  2. Hashtable en C#
  3. Dictionnaire vs Hashtable en C#
Dictionnaire vs Hashtable en C#

Ce guide discutera des différences entre Dictionnaire et Hashtable en C#.

Pour comprendre laquelle de ces collections est la meilleure et la préférée, nous devons comprendre leurs principes fondamentaux. Passons donc en revue la syntaxe, les caractéristiques, les fonctionnalités et les méthodes associées à ces deux collections.

Lequel préférez-vous lorsque vous travaillez sur C# ? Ce qui est mieux?

Toutes ces questions trouveront une réponse ci-dessous. Plongeons-nous !

Dictionnaire en C#

Le Dictionnaire est une collection générique. Il stocke les données dans des paires clé-valeur et cette collection n’a pas d’ordre particulier.

La syntaxe du Dictionnaire est la suivante :

Dictionary<TKey, TValue>

Nous transmettons les valeurs de données avec leurs clés. Passons en revue les caractéristiques du Dictionnaire.

Caractéristiques du Dictionnaire en C#

  1. Il stocke les paires clé-valeur.
  2. Son espace de noms est System.Collections.Generic.
  3. Les clés du Dictionnaire ne doivent pas être nulles et doivent être uniques.
  4. Cependant, les valeurs peuvent être nulles et dupliquées.
  5. Nous pouvons accéder à la valeur des données via sa clé correspondante, par exemple, myDictionary[key].
  6. Tous les éléments sont considérés comme KeyValuePair<TKey, TValue>.

Créer un dictionnaire en C#

Vous pouvez créer un Dictionnaire en C# en passant le type de valeurs et leurs clés correspondantes qu’il peut stocker. Regardez le code suivant pour voir comment nous créons un Dictionnaire.

IDictionary<int, string> rollno_names = new Dictionary<int, string>();
rollno_names.Add(1, "Ali");  // adding a key/value using the Add() method
rollno_names.Add(2, "Haider");
rollno_names.Add(3, "Saad");

// The following throws runtime exception: key already added.
// rollno_names.Add(3, "Rafay");

foreach (KeyValuePair<int, string> i in rollno_names)
  Console.WriteLine("Key: {0}, Value: {1}", i.Key, i.Value);

// creating a dictionary using collection-initializer syntax
var countries = new Dictionary<string, string>() {
  { "UK", "United Kingdom" }, { "USA", "United States of America" }, { "PK", "Pakistan" }
};

foreach (var j in countries) Console.WriteLine("Key: {0}, Value: {1}", j.Key, j.Value);

Dans le code ci-dessus, rollno_names est un “Dictionnaire” avec int comme type de données clé et chaîne comme type de données valeur comme suit :

Dictionary<int, string>

Ce Dictionnaire particulier peut stocker des clés int et des valeurs de chaîne. Le second Dictionnaire est celui des pays créé par l’initialisateur de la collection.

Ses clés et ses valeurs sont des types de données de chaîne. Si vous essayez de dupliquer la valeur-clé et de la rendre nulle, vous obtiendrez une exception d’exécution.

Accéder à un élément de dictionnaire en C#

Vous pouvez accéder à un élément Dictionnaire à l’aide de son indexeur. Vous devez spécifier chaque clé pour accéder à sa valeur correspondante.

ElementAt() est une autre approche pour obtenir la paire clé-valeur. Jetez un oeil au code suivant.

var countries = new Dictionary<string, string>() {
  { "UK", "UnitedKingdom" }, { "USA", "United State of America" }, { "PK", "Pakistan" }
};

Console.WriteLine(countries["UK"]);   // prints value of UK key
Console.WriteLine(countries["USA"]);  // prints value of USA key
// Console.WriteLine(countries["France"]); // runtime exception: key does not exist

// use ContainsKey() to check for the unknown key
if (countries.ContainsKey("France")) {
  Console.WriteLine(countries["France"]);
}

// use TryGetValue() to get a value of the unknown key
string result;

if (countries.TryGetValue("France", out result)) {
  Console.WriteLine(result);
}

// use ElementAt() to retrieve the key-value pair using the index
for (int i = 0; i < countries.Count; i++) {
  Console.WriteLine("Key: {0}, Value: {1}", countries.ElementAt(i).Key,
                    countries.ElementAt(i).Value);
}

Dans le code ci-dessus, vous pouvez voir qu’il n’y a pas de paire clé-valeur contenant France. Ainsi, le code ci-dessus donnera une exception d’exécution.

Mettre à jour un élément de dictionnaire en C#

En spécifiant une clé dans l’indexeur, on peut changer/mettre à jour la valeur d’une clé. Si une clé n’est pas trouvée dans le Dictionnaire, elle lèvera l’exception KeyNotFoundException ; utilisez donc la fonction ContainsKey() avant d’accéder à des clés inconnues.

Jetez un oeil au code suivant.

var countries = new Dictionary<string, string>() { { "UK", "London, Manchester, Birmingham" },
                                                   { "USA", "Chicago, New York, Washington" },
                                                   { "PK", "Pakistan" } };

countries["UK"] = "Europe";    // update value of UK key
countries["USA"] = "America";  // update value of USA key
// countries["France"] = "Western Europe"; //throws run-time exception: KeyNotFoundException

if (countries.ContainsKey("France")) {
  countries["France"] = "Western Europe";
}

Supprimer un élément de dictionnaire en C#

Une paire clé-valeur déjà présente dans un Dictionnaire est supprimée à l’aide de la méthode Remove(). Tous les éléments Dictionary sont supprimés à l’aide de la méthode Clear().

var countries = new Dictionary<string, string>() {
  { "UK", "UnitedKingdom" }, { "USA", "United state of America" }, { "PK", "Pakistan" }
};

countries.Remove("UK");  // removes UK
// countries.Remove("France"); //throws run-time exception: KeyNotFoundException

if (countries.ContainsKey("France")) {  // check key before removing it
  countries.Remove("France");
}

countries.Clear();

Hashtable en C#

Contrairement au Dictionnaire, Hashtable est une collection non générique. Il stocke également les paires clé-valeur.

En calculant le code de hachage pour chaque clé et en le stockant dans un compartiment interne séparé, il améliore les recherches en faisant correspondre le code de hachage de la clé fournie lors de l’accès aux valeurs. Jetez un oeil à quelques caractéristiques de la Hashtable.

Caractéristiques de la Hashtable en C#

  1. Les paires clé-valeur sont conservées dans des Hashtables.
  2. Il appartient à l’espace de noms SystemCollection.
  3. L’interface IDictionary est implémentée.
  4. Les clés ne peuvent pas être nulles et doivent être distinctes.
  5. Les valeurs peuvent être dupliquées ou nulles.
  6. Les valeurs peuvent être obtenues en fournissant à l’indexeur la clé appropriée, comme dans Hashtable[key].
  7. Les objets DictionaryEntry sont utilisés pour stocker les éléments.

Créer une Hashtable en C#

Regardez le code auto-explicatif suivant pour comprendre la création d’un Hashtable.

`Hashtable` rollno_names = new `Hashtable`();
rollno_names.Add(1, "Ali");  // adding a key/value using the Add() method
rollno_names.Add(2, "Haider");
rollno_names.Add(3, "Saad");

// The following throws runtime exception: key already added.
// rollno_names.Add(3, "Rafay");

foreach (DictionaryEntry i in rollno_names)
  Console.WriteLine("Key: {0}, Value: {1}", i.Key, i.Value);

// creating a `Hashtable` using collection-initializer syntax
var countries = new `Hashtable`() {
  { "UK", "UnitedKingdom" }, { "USA", "United State of America" }, { "PK", "Pakistan" }
};

foreach (DictionaryEntry j in countries) Console.WriteLine("Key: {0}, Value: {1}", j.Key, j.Value);

Nous pouvons créer le Hashtable tout comme le Dictionnaire. La seule différence est qu’il n’est pas générique, nous n’avons donc pas à spécifier les types de données des clés et leurs valeurs correspondantes.

Ajouter un dictionnaire dans la Hashtable en C#

Nous pouvons créer l’objet du Dictionnaire, et en passant simplement cet objet lors de la création de la Hashtable, nous pouvons ajouter les paires clé-valeur Dictionnaire à l’intérieur de la Hashtable.

Mettre à jour la Hashtable en C#

En saisissant une clé dans l’indexeur, vous pouvez récupérer la valeur d’une clé existante à partir de la Hashtable. Étant donné que le Hashtable est une collection non générique (ce qui signifie qu’il n’y a pas de types de données pour les clés et les valeurs), le type de conversion en chaîne est nécessaire lors de l’obtention de valeurs à partir de celui-ci.

Jetez un oeil au code suivant.

// creating a Hashtable using collection-initializer syntax
var countries = new Hashtable() {
  { { "UK", "UnitedKingdom" }, { "USA", "United State of America" }, { "PK", "Pakistan" } };

string countrynameUK = (string)countries["UK"];    // cast to string
string countrynameUSA = (string)countries["USA"];  // cast to string

Console.WriteLine(countrynameUK);
Console.WriteLine(countrynameUSA);

countries["UK"] = "Euorpe";    // update value of UK key
countries["USA"] = "America";  // update value of USA key

if (!countries.ContainsKey("France")) {
  countries["France"] = "Western Euorpe";
}

Supprimer des éléments de la Hashtable en C#

Les paires clé-valeur données d’un Hashtable sont supprimées à l’aide de la méthode Remove(). Si la clé fournie n’est pas présente dans la Hashtable, elle lève l’exception KeyNotfoundException ; ainsi, avant de supprimer une clé, utilisez la méthode ContainsKey() pour voir si elle existe déjà.

Utilisez la fonction Clear() pour supprimer tous les éléments à la fois.

var countries = new Hashtable() {
  { "UK", "UnitedKingdom" }, { "USA", "United State of America" }, { "PK", "Pakistan" }
};

countries.Remove("UK");  // removes UK
// countries.Remove("France"); //throws run-time exception: KeyNotFoundException

if (countries.ContainsKey("France")) {  // check key before removing it
  countries.Remove("France");
}

countries.Clear();  // removes all elements

Dictionnaire vs Hashtable en C#

Dictionary Hashtable
Si nous essayons de découvrir une clé qui n’existe pas, elle renvoie ou lève une exception. Si nous essayons de découvrir une clé qui n’existe pas, elle renvoie null.
Parce qu’il n’y a pas de boxing et unboxing, c’est plus rapide qu’un Hashtable. En raison de l’emballage et du déballage requis, cela prend plus de temps qu’un Dictionnaire.
La sécurité des threads n’est disponible que pour les membres statiques publics. Les membres d’une Hashtable sont tous thread-safe,
Puisque le Dictionnaire est un type générique, n’importe quel type de données peut être utilisé avec lui (lors de sa création, nous devons spécifier les types de données pour les clés et les valeurs). Pas un type générique.
L’implémentation de Hashtable avec des clés et des valeurs fortement typées est appelée Dictionnaire. Étant donné que les Hashtables sont des structures de données typées de manière flexible, tous les types de clé et de valeur peuvent être ajoutés.

Sur la base de ces faits, nous pouvons dire que Dictionary est préféré à la Hashtable. Parce que vous pouvez insérer n’importe quel élément aléatoire dans Dictionary<TKey, TValue> et que vous n’avez pas à caster les valeurs que vous retirez, vous gagnez en sécurité de type.

Auteur: Haider Ali
Haider Ali avatar Haider Ali avatar

Haider specializes in technical writing. He has a solid background in computer science that allows him to create engaging, original, and compelling technical tutorials. In his free time, he enjoys adding new skills to his repertoire and watching Netflix.

LinkedIn

Article connexe - Csharp Dictionary