web-dev-qa-db-fra.com

Différence entre Dictionary et Hashtable

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?

104
blitzkriegz

Simplement, Dictionary<TKey,TValue> est un type générique permettant:

  • typage statique (et vérification à la compilation)
  • utiliser sans boxe

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>.

191
Marc Gravell

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;
    }
  }
82
Pritom Nandy

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.

22
Rohit Gupta

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

12
Frans Bouma

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.

10
Pranav Singh

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.

6
Rashmi Pandit

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. :)

3
shiv govind