1568 Stimmen

Warum wird Dictionary gegenüber Hashtable in C# bevorzugt?

In den meisten Programmiersprachen werden Wörterbücher gegenüber Hashtabellen bevorzugt. Was sind die Gründe dafür?

32 Stimmen

> Dies ist nicht unbedingt richtig. Eine Hashtabelle ist eine Implementierung eines Wörterbuchs. Eine typische Implementierung, und sie mag die Standardimplementierung in .NET sein, aber sie ist nicht per Definition die einzige. Ich bin mir nicht sicher, ob dies vom ECMA-Standard gefordert wird, aber die MSDN-Dokumentation sehr deutlich, dass es als Hashtable implementiert ist. Sie bieten sogar die SortedList-Klasse für Zeiten, in denen eine Alternative sinnvoller ist.

25 Stimmen

@Promit Ich dachte immer, die Dictionary war eine Implementierung des Hashtable .

2 Stimmen

Ich denke, der Grund dafür ist, dass man in einem Dictionary den Typ des Schlüssels und des Wertes selbst definieren kann. Die Hashtable kann nur Objekte aufnehmen und speichert die Paare basierend auf dem Hash (von object.GetHashCode() ).

35voto

rix0rrr Punkte 9278

Es wird behauptet, dass ein Dictionary dasselbe ist wie eine Hash-Tabelle.

Dies ist nicht unbedingt der Fall. Eine Hashtabelle ist eine Möglichkeit, um implementieren ein Wörterbuch. Ein typisches Wörterbuch, und es kann das Standardwörterbuch in .NET sein, das in der Dictionary Klasse, aber sie ist nicht per Definition die einzige.

Man könnte ein Wörterbuch genauso gut mit einer verknüpften Liste oder einem Suchbaum implementieren, es wäre nur nicht so effizient (in Bezug auf irgendeine Metrik von effizient).

4 Stimmen

MS-Dokumente sagen: "Das Abrufen eines Wertes mit Hilfe seines Schlüssels ist sehr schnell, nahe O(1), da die Klasse Dictionary <(Of <(TKey, TValue >)>) als Hash-Tabelle implementiert ist." - Sie sollten also garantiert eine Hashtable haben, wenn Sie mit Dictionary<K,V> . IDictionary<K,V> könnte aber auch alles andere sein :)

15 Stimmen

@rix0rrr - Ich glaube, Sie haben das falsch verstanden, ein Dictionary benutzt eine HashTable, nicht eine HashTable ein Dictionary.

8 Stimmen

@JosephHamilton - rix0rrr hat es richtig gesagt: "Eine Hashtabelle es eine Implementierung eines Wörterbuch ." Er meint das Konzept "Wörterbuch", nicht die Klasse (beachten Sie die Kleinschreibung). Konzeptionell implementiert eine Hashtabelle eine Dictionary-Schnittstelle. In .NET verwendet Dictionary eine Hash-Tabelle, um IDictionary zu implementieren. Es ist chaotisch ;)

25voto

Sujit Punkte 3507

Collections & Generics sind für den Umgang mit Gruppen von Objekten nützlich. In .NET fallen alle Sammlungsobjekte unter die Schnittstelle IEnumerable die ihrerseits ArrayList(Index-Value)) & HashTable(Key-Value) . Nach .NET Framework 2.0, ArrayList & HashTable wurden ersetzt durch List & Dictionary . Nun, die Arraylist & HashTable werden in heutigen Projekten nicht mehr verwendet.

Was den Unterschied zwischen HashTable & Dictionary , Dictionary generisch ist, während Hastable ist nicht generisch. Wir können jede Art von Objekt zu HashTable aber beim Abrufen müssen wir sie in den gewünschten Typ umwandeln. Es ist also nicht typsicher. Aber zum dictionary Bei der Deklaration können wir den Typ von Schlüssel und Wert angeben, so dass beim Abrufen kein Casting erforderlich ist.

Schauen wir uns ein Beispiel an:

HashTable

class HashTableProgram
{
    static void Main(string[] args)
    {
        Hashtable ht = new Hashtable();
        ht.Add(1, "One");
        ht.Add(2, "Two");
        ht.Add(3, "Three");
        foreach (DictionaryEntry de in ht)
        {
            int Key = (int)de.Key; //Casting
            string value = de.Value.ToString(); //Casting
            Console.WriteLine(Key + " " + value);
        }

    }
}

Wörterbuch,

class DictionaryProgram
{
    static void Main(string[] args)
    {
        Dictionary<int, string> dt = new Dictionary<int, string>();
        dt.Add(1, "One");
        dt.Add(2, "Two");
        dt.Add(3, "Three");
        foreach (KeyValuePair<int, String> kv in dt)
        {
            Console.WriteLine(kv.Key + " " + kv.Value);
        }
    }
}

2 Stimmen

Anstatt den Datentyp für KeyValuePair explizit zuzuweisen, könnten wir var verwenden. Das würde die Tipparbeit reduzieren - foreach (var kv in dt)...nur ein Vorschlag.

21voto

alexandrekow Punkte 1857

El Umfassende Untersuchung von Datenstrukturen mit C# Artikel auf MSDN besagt, dass es auch einen Unterschied in der Strategie zur Lösung von Kollisionen :

Die Hashtable-Klasse verwendet eine Technik, die als Wiederaufbereitung .

Rehashing funktioniert folgendermaßen: Es gibt eine Reihe von Hash-Funktionen, H 1 ... H n und beim Einfügen oder Abrufen eines Elements aus der Hash-Datei Tabelle, zunächst die H 1 Hash-Funktion verwendet wird. Führt dies zu einer Kollision führt, wird H 2 wird stattdessen versucht, und zwar bis zu H n falls erforderlich.

Das Wörterbuch verwendet eine Technik, die als Verkettung .

Beim Rehashing wird im Falle einer Kollision der Hash neu berechnet und der neue Slot, der einem Hash entspricht, ausprobiert. Bei der Verkettung hingegen, eine sekundäre Datenstruktur verwendet wird, um alle Kollisionen . Genauer gesagt, hat jeder Slot im Dictionary ein Array von Elementen, die auf diesen Bereich abgebildet werden. Im Falle einer Kollision wird das kollidierende Element der Liste des Bereichs vorangestellt.

19voto

Oliver Punkte 41055

Seit .NET Framework 3.5 gibt es auch eine HashSet<T> die alle Vorteile der Dictionary<TKey, TValue> wenn Sie nur die Schlüssel und keine Werte benötigen.

Wenn Sie also eine Dictionary<MyType, object> und setzen Sie den Wert immer auf null um die typsichere Hash-Tabelle zu simulieren, sollten Sie vielleicht in Erwägung ziehen, auf die HashSet<T> .

19voto

Altaf Patel Punkte 1303

Wörterbuch:

  • Es gibt eine Ausnahme zurück, wenn versucht wird, einen Schlüssel zu finden, der nicht existiert.

  • Sie ist schneller als eine Hashtable, da kein Boxing und Unboxing stattfindet.

  • Nur öffentliche statische Mitglieder sind thread-sicher.

  • Dictionary ist ein generischer Typ, d.h. wir können ihn mit jedem Datentyp verwenden (beim Erstellen müssen die Datentypen für Schlüssel und Werte angegeben werden).

    Ejemplo: Dictionary<string, string> <NameOfDictionaryVar> = new Dictionary<string, string>();

  • Dictionay ist eine typsichere Implementierung von Hashtable, Keys y Values sind stark typisiert.

Hashtabelle:

  • Er gibt null zurück, wenn wir versuchen, einen Schlüssel zu finden, der nicht existiert.

  • Es ist langsamer als das Wörterbuch, weil es das Einpacken und Auspacken erfordert.

  • Alle Mitglieder in einer Hashtable sind thread-sicher,

  • Hashtable ist kein allgemeiner Typ,

  • Hashtable ist eine lockere Datenstruktur, zu der wir Schlüssel und Werte beliebigen Typs hinzufügen können.

0 Stimmen

"Es gibt eine Exception zurück, wenn wir versuchen, einen Schlüssel zu finden, der nicht existiert." Nicht, wenn Sie Dictionary.TryGetValue

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X