wake-up-neo.com

Unterschied zwischen Dictionary und Hashtable

Mögliches Duplikat:
Warum wird Dictionary in C # der Hashtabelle vorgezogen?

Was ist der Unterschied zwischen Dictionary und Hashtable? Wie man entscheidet, welches man benutzt?

104
blitzkriegz

Dictionary<TKey,TValue> Ist einfach ein generischer Typ, der Folgendes ermöglicht:

  • statische Typisierung (und Überprüfung zur Kompilierungszeit)
  • verwenden Sie ohne zu boxen

Wenn Sie .NET 2.0 oder höher verwenden, sollten Sie bevorzugenDictionary<TKey,TValue> (Und die anderen generischen Sammlungen)

Ein subtiler, aber wichtiger Unterschied ist, dass Hashtable mehrere Reader-Threads mit einem einzigen Writer-Thread unterstützt, während Dictionary keine Threadsicherheit bietet. Wenn Sie Thread-Sicherheit mit einem generischen Wörterbuch benötigen, müssen Sie Ihre eigene Synchronisation implementieren oder (in .NET 4.0) ConcurrentDictionary<TKey, TValue> Verwenden.

191
Marc Gravell

Geben wir ein Beispiel an, das den Unterschied zwischen Hashtable und Dictionary erklärt.

Hier ist eine Methode, die Hashtable implementiert

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;
    //}
}

Das Folgende ist für das Wörterbuch

  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

Es gibt einen weiteren wichtigen Unterschied zwischen einer HashTable und einem Dictionary. Wenn Sie Indexer verwenden, um einen Wert aus einer HashTable abzurufen, gibt die HashTable für ein nicht vorhandenes Element erfolgreich null zurück, während das Dictionary einen Fehler ausgibt, wenn Sie versuchen, mit einem Indexer auf ein Element zuzugreifen, das im Dictionary nicht vorhanden ist

22
Rohit Gupta

Das Wörterbuch ist typisiert (Werttypen brauchen kein Boxen), eine Hashtabelle nicht (Werttypen brauchen Boxen). Hashtable hat eine bessere Möglichkeit, einen Wert zu erhalten als Dictionary IMHO, da es immer weiß, dass der Wert ein Objekt ist. Wenn Sie .NET 3.5 verwenden, ist es einfach, eine Erweiterungsmethode für das Wörterbuch zu schreiben, um ein ähnliches Verhalten zu erzielen.

Wenn Sie mehrere Werte pro Schlüssel benötigen, überprüfen Sie meinen Quellcode von MultiValueDictionary hier: Multimap in .NET

12
Frans Bouma

Möchten Sie einen Unterschied hinzufügen:

Der Versuch, auf einen nicht vorhandenen Schlüssel zuzugreifen, führt zu einem Laufzeitfehler im Dictionary, aber zu keinem Problem in der Hash-Tabelle, da statt des Fehlers null zurückgegeben wird.

z.B.

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

hier kein Fehler für Schlüssel 0 & auch für Schlüssel "zehn" (Hinweis: t ist klein)

//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]);

hier Fehler für Schlüssel 0 und auch für Schlüssel 10, da beide im Wörterbuch nicht vorhanden sind, Laufzeitfehler, während versucht wird, auf sie zuzugreifen.

10
Pranav Singh

Die Hashtable-Klasse ist eine bestimmte Art von Dictionary-Klasse, die einen ganzzahligen Wert (als Hash bezeichnet) verwendet, um die Speicherung ihrer Schlüssel zu erleichtern. Die Hashtable-Klasse verwendet den Hash, um die Suche nach einem bestimmten Schlüssel in der Auflistung zu beschleunigen. Jedes Objekt in .NET leitet sich von der Object-Klasse ab. Diese Klasse unterstützt die GetHash-Methode, die eine Ganzzahl zurückgibt, die das Objekt eindeutig identifiziert. Die Hashtable-Klasse ist im Allgemeinen eine sehr effiziente Sammlung. Das einzige Problem mit der Hashtable-Klasse besteht darin, dass ein gewisser Overhead erforderlich ist. Bei kleinen Sammlungen (weniger als zehn Elemente) kann der Overhead die Leistung beeinträchtigen.

Es gibt einige spezielle Unterschiede zwischen zwei, die berücksichtigt werden müssen:

HashTable: Dies ist eine nicht generische Sammlung. Der größte Aufwand für diese Sammlung besteht darin, dass Ihre Werte automatisch gepackt werden. Um den ursprünglichen Wert zu erhalten, müssen Sie ein Unboxing durchführen, um die Leistung Ihrer Anwendung zu beeinträchtigen.

Wörterbuch: Dies ist eine generische Art der Sammlung, bei der kein implizites Boxen erforderlich ist. Sie müssen also kein Unboxing ausführen, um immer die ursprünglichen Werte zu erhalten, die Sie gespeichert haben, damit die Leistung Ihrer Anwendung verbessert wird.

der zweite wesentliche Unterschied ist:

wenn Sie auf der Basis eines nicht vorhandenen Schlüssels auf einen Wert in der Hash-Tabelle zugreifen wollten, wird null zurückgegeben. Im Fall von Dictionary erhalten Sie jedoch eine KeyNotFoundException.

6
Rashmi Pandit

ILookup Interface wird in .net 3.5 mit linq verwendet.

Die HashTable ist die schwach typisierte Basisklasse. Die abstrakte DictionaryBase-Klasse ist streng typisiert und verwendet intern eine HashTable.

Ich fand eine seltsame Sache am Wörterbuch, als wir die mehreren Einträge im Wörterbuch hinzufügen, wird die Reihenfolge beibehalten, in der die Einträge hinzugefügt werden. Wenn ich also foreach auf das Wörterbuch anwende, erhalte ich die Datensätze in der Reihenfolge, in der ich sie eingefügt habe.

Während dies mit normalem HashTable nicht zutrifft, wird die Reihenfolge nicht beibehalten, wenn ich dieselben Datensätze in Hashtable hinzufüge. Meines Wissens basiert Dictionary auf Hashtable. Wenn dies zutrifft, warum behält mein Dictionary die Reihenfolge bei, HashTable jedoch nicht?

Die Gründe für das unterschiedliche Verhalten liegen darin, dass das generische Wörterbuch eine Hashtabelle implementiert, jedoch nicht auf System.Collections.Hashtable basiert. Die Implementierung des generischen Wörterbuchs basiert auf der Zuweisung von Schlüssel-Wert-Paaren aus einer Liste. Diese werden dann mit den Hashtable-Buckets für den Direktzugriff indiziert. Wenn jedoch ein Enumerator zurückgegeben wird, wird die Liste nur in der Reihenfolge durchlaufen, in der sie eingefügt werden, solange die Einträge nicht erneut verwendet werden.

shiv govind Birlasoft. :)

3
shiv govind