Duplicate possible:
Pourquoi le dictionnaire est préférable à hashtable en C #?
Quelle est la différence entre Dictionary et Hashtable. Comment décider lequel utiliser?
Simplement, Dictionary<TKey,TValue>
est un type générique permettant:
Si vous êtes .NET 2.0 ou supérieur, vous devriez préférerDictionary<TKey,TValue>
_ (et les autres collections génériques)
Une différence subtile mais importante est que Hashtable
prend en charge plusieurs threads de lecture avec un seul thread d'écrivain, tandis que Dictionary
n'offre aucune sécurité de thread. Si vous avez besoin de la sécurité des threads avec un dictionnaire générique, vous devez implémenter votre propre synchronisation ou (dans .NET 4.0) utiliser ConcurrentDictionary<TKey, TValue>
.
Donnons un exemple qui expliquerait la différence entre hashtable et dictionnaire.
Voici une méthode qui implémente hashtable
public void MethodHashTable()
{
Hashtable objHashTable = new Hashtable();
objHashTable.Add(1, 100); // int
objHashTable.Add(2.99, 200); // float
objHashTable.Add('A', 300); // char
objHashTable.Add("4", 400); // string
lblDisplay1.Text = objHashTable[1].ToString();
lblDisplay2.Text = objHashTable[2.99].ToString();
lblDisplay3.Text = objHashTable['A'].ToString();
lblDisplay4.Text = objHashTable["4"].ToString();
// ----------- Not Possible for HashTable ----------
//foreach (KeyValuePair<string, int> pair in objHashTable)
//{
// lblDisplay.Text = pair.Value + " " + lblDisplay.Text;
//}
}
Ce qui suit est pour dictionnaire
public void MethodDictionary()
{
Dictionary<string, int> dictionary = new Dictionary<string, int>();
dictionary.Add("cat", 2);
dictionary.Add("dog", 1);
dictionary.Add("llama", 0);
dictionary.Add("iguana", -1);
//dictionary.Add(1, -2); // Compilation Error
foreach (KeyValuePair<string, int> pair in dictionary)
{
lblDisplay.Text = pair.Value + " " + lblDisplay.Text;
}
}
Il y a encore une différence importante entre HashTable et Dictionary. Si vous utilisez des indexeurs pour extraire une valeur d'une table de hachage, la table de hachage retournera avec succès la valeur null pour un élément non existant, tandis que le dictionnaire génère une erreur si vous essayez d'accéder à un élément à l'aide d'un indexeur qui n'existe pas dans le dictionnaire.
Le dictionnaire est dactylographié (les types de valeur n'ont donc pas besoin de boxe), pas la table de hachage (les types de valeur ont donc besoin de la boxe). Hashtable permet d'obtenir une valeur plus agréable que le dictionnaire IMHO, car il sait toujours que la valeur est un objet. Toutefois, si vous utilisez .NET 3.5, il est facile d’écrire une méthode d’extension pour dictionnaire afin d’obtenir un comportement similaire.
Si vous avez besoin de plusieurs valeurs par clé, consultez mon code source de MultiValueDictionary ici: carte multiple dans .NET
Voulez-vous ajouter une différence:
Tenter d'accéder à une clé inexistante génère une erreur d'exécution dans le dictionnaire, mais aucun problème dans la table de hachage, car elle renvoie null au lieu d'une erreur.
par exemple.
//No strict type declaration
Hashtable hash = new Hashtable();
hash.Add(1, "One");
hash.Add(2, "Two");
hash.Add(3, "Three");
hash.Add(4, "Four");
hash.Add(5, "Five");
hash.Add(6, "Six");
hash.Add(7, "Seven");
hash.Add(8, "Eight");
hash.Add(9, "Nine");
hash.Add("Ten", 10);// No error as no strict type
for(int i=0;i<=hash.Count;i++)//=>No error for index 0
{
//Can be accessed through indexers
Console.WriteLine(hash[i]);
}
Console.WriteLine(hash["Ten"]);//=> No error in Has Table
ici pas d'erreur pour la touche 0 & aussi pour la touche "dix" (note: t est petit)
//Strict type declaration
Dictionary<int,string> dictionary= new Dictionary<int, string>();
dictionary.Add(1, "One");
dictionary.Add(2, "Two");
dictionary.Add(3, "Three");
dictionary.Add(4, "Four");
dictionary.Add(5, "Five");
dictionary.Add(6, "Six");
dictionary.Add(7, "Seven");
dictionary.Add(8, "Eight");
dictionary.Add(9, "Nine");
//dictionary.Add("Ten", 10);// error as only key, value pair of type int, string can be added
//for i=0, key doesn't exist error
for (int i = 1; i <= dictionary.Count; i++)
{
//Can be accessed through indexers
Console.WriteLine(dictionary[i]);
}
//Error : The given key was not present in the dictionary.
//Console.WriteLine(dictionary[10]);
ici erreur pour la clé 0 et aussi pour la clé 10 car les deux sont inexistants dans le dictionnaire, erreur d’exécution, lors d’une tentative d’accès.
La classe Hashtable est un type spécifique de classe de dictionnaire qui utilise une valeur entière (appelée hachage) pour faciliter le stockage de ses clés. La classe Hashtable utilise le hachage pour accélérer la recherche d'une clé spécifique dans la collection. Chaque objet de .NET dérive de la classe Object. Cette classe prend en charge la méthode GetHash, qui renvoie un entier identifiant de manière unique l'objet. La classe Hashtable est une collection très efficace en général. Le seul problème avec la classe Hashtable est qu'elle nécessite un peu de temps système et que, pour les petites collections (moins de dix éléments), le temps système peut nuire aux performances.
Il y a une différence spéciale entre deux qui doit être considérée:
HashTable: est une collection non générique. La plus grosse surcharge de cette collection est qu’elle boxe automatiquement pour vos valeurs et que, pour obtenir votre valeur d’origine, vous devez effectuer un uning, afin de diminuer les performances de votre application.
Dictionnaire: Il s'agit d'un type de collection générique dans lequel aucune boxe implicite n'est nécessaire. Vous n'avez donc pas besoin de décompresser, vous obtiendrez toujours les valeurs d'origine stockées, ce qui améliorera les performances de votre application.
la deuxième différence considérable est:
si vous tentiez d'accéder à une valeur à partir de la table de hachage sur la base d'une clé inexistante, elle renvoie la valeur null.Mais dans le cas de Dictionary, elle vous donnera une exception KeyNotFoundException.
ILookup Interface est utilisé dans .net 3.5 avec linq.
HashTable est la classe de base de type faible. la classe abstraite DictionaryBase est très typée et utilise en interne un HashTable.
J'ai trouvé une chose étrange à propos de Dictionary. Lorsque nous ajoutons les entrées multiples dans Dictionary, l'ordre dans lequel les entrées sont ajoutées est conservé. Ainsi, si j'applique un foreach sur le dictionnaire, je vais obtenir les enregistrements dans le même ordre que je les ai insérés.
Tandis que cela n’est pas vrai avec HashTable normal, lorsque j’ajoute les mêmes enregistrements dans Hashtable, l’ordre n’est pas maintenu. Autant que je sache, Dictionary est basé sur Hashtable. Si cela est vrai, pourquoi mon dictionnaire conserve-t-il l'ordre mais pas HashTable?
Quant à savoir pourquoi ils se comportent différemment, c'est parce que Generic Dictionary implémente une table de hachage, mais n'est pas basé sur System.Collections.Hashtable. L'implémentation du dictionnaire générique est basée sur l'allocation de paires clé-valeur à partir d'une liste. Ceux-ci sont ensuite indexés avec les compartiments de table de hachage pour un accès aléatoire, mais quand il renvoie un énumérateur, il parcourt simplement la liste dans un ordre séquentiel - ce qui sera l'ordre d'insertion tant que les entrées ne sont pas réutilisées.
shiv govind Birlasoft. :)