Warum ist die Wörterbuch-vorgezogen, Hashtable in C#?
In den meisten Programmier-Sprachen, Wörterbücher, bevorzugt über hashtables.
Was sind die Gründe dahinter?
- > Dies ist nicht unbedingt wahr. Eine hash-Tabelle ist eine Implementierung eines dictionary. Ein typisches one an, es kann sein, das standardmäßig in .NET, aber es ist nicht per definition der einzige. Ich bin mir nicht sicher, dass dies erforderlich ist, durch den ECMA-standard, aber die MSDN-Dokumentation sehr deutlich ruft es aus, wie Sie derzeit umgesetzt wird, wie eine hashtable. Sie bieten sogar die SortedList-Klasse für die Zeiten, wenn eine alternative mehr zumutbar ist.
- Ich dachte immer, die
Dictionary
war eine Umsetzung derHashtable
. - Ich denke der Grund dafür ist, dass in einem Wörterbuch können Sie definieren, welche Art von Schlüssel und Wert für Ihr selfe. die Hashtabelle kann nur Objekte und speichert die Paare basierend auf der hash (Objekt.GetHashCode() ).
- Ihre Forderung ist ganz Irre ... eine hash-Tabelle enthält nur eine Instanz von jedem Schlüssel, und eine Suche ist nie Erträge mehrere Einträge; wenn Sie möchten, verknüpfen Sie mehrere Werte mit jeder Taste, stellen Sie die hash-Tabelle Wert in einer Liste mit Werten. Es gibt keine solche Datenstruktur als "Wörterbuch" Wörterbuch ... ist einfach der name, dass einige Bibliotheken verwenden Sie für Ihre hash-Tabelle. z.B. C#'s nicht-generische hash-Tabelle genannt
HashTable
. Wenn Sie Hinzugefügt, Generika, um die Sprache, nannten Sie die generische versionDictionary
. Sind beide hash-Tabellen. - Ihre Forderung ist Irre ... eine hash-Tabelle (en.wikipedia.org/wiki/Hash_table) ist eine bestimmte Implementierung eines dictionary, aka assoziatives array (en.wikipedia.org/wiki/Associative_array), und, als ein Wörterbuch, enthält nur eine Instanz von jedem Schlüssel, und eine Suche ist nie Erträge mehrere Einträge; wenn Sie möchten, verknüpfen Sie mehrere Werte mit jeder Taste, stellen Sie die hash-Tabelle Wert in einer Liste mit Werten. Und die .NET Dictionary und Hashtable die Klassen sind beide hash-Tabellen.
- Der ursprüngliche Titel war die Frage c# - spezifisch. Ich habe wiederhergestellt "in c#", um den Titel.
- Nicht zu verwechseln mit HashSet<T>, die im Gegensatz zu
HashTable
ist generisch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für was es Wert ist, ein Wörterbuch ist (konzeptionell) eine hash-Tabelle.
Wenn du meintest "warum verwenden wir den
Dictionary<TKey, TValue>
- Klasse anstelle derHashtable
Klasse?", dann ist es eine einfache Antwort:Dictionary<TKey, TValue>
ist ein generischer Typ,Hashtable
ist nicht. Das bedeutet, dass Sie bekommen, geben Sie die Sicherheit mitDictionary<TKey, TValue>
, da kann man nicht fügen Sie eine beliebige random-Objekt, und Sie haben nicht zu werfen den Werten, die Sie nehmen.Interessant, die
Dictionary<TKey, TValue>
Umsetzung in der .NET Framework ist auf der Grundlage derHashtable
, wie Sie sagen können, aus diesem Kommentar in Ihren Quellcode:Quelle
HashTable
Daten-Struktur ist ein Wörterbuch, das eine hash-Tabelle (Konzept), richtig?HashTable
(Klasse) undDictionary
(Klasse) hash-Tabellen (Konzept), aber einHashTable
ist nicht einDictionary
noch ist einDictionary
eineHashTable
. Sie kommen in sehr ähnlichen Moden, undDictionary<Object,Object>
können das gleiche tun nicht typisierte Art, die eineHashTable
tut, aber Sie tun nicht direkt weitergeben-code (obwohl die Teile werden wahrscheinlich implementiert werden, in sehr ähnlicher Weise).Hash Table
ist eine Lösung mit bestimmten Laufzeiten. Auch, generic hat auch eine Bedeutung außerhalb von C#, also, wenn Sie nicht wissen, C#, "generische dictionary" verstanden werden könnten, als die abstrakte Datenstruktur.HashTable
ist mehr (Kleinbuchstaben) "generic" als die .NETDictionary
, und daher die alten (beide in meinem Satz und in der Reihenfolge der Entwicklung) ist wahrscheinlich die re-implementiert einen Wrapper der letzteren (die, btw, wäre auch eine ziemlich Allgemeine Umgestaltung der Praxis in diesem Szenario), falls code-Größe / perf Probleme wurden nicht sig Fragen, die Sie usu. nicht (außerhalb des Framework-level-code).Dictionary
<<<>>>Hashtable
Unterschiede:Synchronized()
MethodeKeyValuePair
<<<>>> Aufgelistet item:DictionaryEntry
Dictionary
/Hashtable
ähnlichkeiten:GetHashCode()
MethodeÄhnliche .NET-Sammlungen (der Kandidaten zu verwenden, anstatt Dictionary und Hashtable):
ConcurrentDictionary
- thread sicher (gefahrlos betreten werden kann von mehreren threads gleichzeitig)HybridDictionary
- optimierte Leistung (für paar items und auch für viele Artikel)OrderedDictionary
- Werte können Zugriff über int-index (durch die Reihenfolge, in der die Elemente Hinzugefügt wurden)SortedDictionary
- Elemente automatisch sortiertStringDictionary
- stark typisiert und optimiert für StreicherStringDictionary
...btwStringDictionary
ist nicht das gleiche wieDictionary<string, string>
wenn Sie den Standard-Konstruktor.Weil
Dictionary
ist eine generische Klasse (Dictionary<TKey, TValue>
), so dass der Zugriff auf Ihre Inhalte geben-sicher (d.h. Sie müssen nicht gegossen ausObject
, wie Sie mit einemHashtable
).Vergleichen
zu
Jedoch
Dictionary
ist implementiert als Hashtabelle intern, technisch gesehen, funktioniert auf die gleiche Weise.FYI: In .NET,
Hashtable
ist thread-sicher für die Verwendung durch mehrere Leser-threads und einen einzigen thread schreiben, während inDictionary
öffentlichen static-member sind thread-sicher, aber irgendeine Instanz, die den Mitgliedern nicht garantiert werden, um thread-safe.Mussten wir alle ändern unsere Wörterbücher zurück
Hashtable
weil dieser.ConcurrentDictionary
Klasse, die hat alle public/protected-Methoden implementiert werden, um thread-sicher. Wenn Sie nicht brauchen, um Unterstützung von legacy-Plattformen damit würden Sie ersetzen dieHashtable
in multithreaded code: msdn.microsoft.com/en-us/library/dd287191.aspxIn .NET, den Unterschied zwischen
Dictionary<,>
undHashTable
ist in Erster Linie, dass die ehemaligen ist ein generischer Typ, so erhalten Sie alle Vorteile von Generika in Bezug auf statische Typ-überprüfung (und reduziert Boxen, aber diese ist nicht so groß, wie Menschen neigen dazu zu denken in Bezug auf Leistung - es gibt eine bestimmte Speicher-Kosten zu Boxen, obwohl).Leute sagen, dass ein Wörterbuch ist das gleiche wie eine hash-Tabelle.
Dies ist nicht unbedingt wahr. Eine hash-Tabelle ist ein Weg, um implementieren ein Wörterbuch. Ein typisches one an, es kann sein, das standardmäßig in .NET in der
Dictionary
Klasse, aber es ist nicht per definition der einzige.Könnte man ebenso gut umsetzen, ein Wörterbuch mit einer verknüpften Liste oder einer Suche Baum, es wäre einfach nicht so effizient (für einige Metrische effizienter).
Dictionary<K,V>
.IDictionary<K,V>
könnte alles sein, obwohl 🙂Collections
&Generics
sind nützlich für den Umgang mit Gruppe von Objekten. In .NET, die alle der Sammlung Objekte kommt unter der SchnittstelleIEnumerable
, die wiederumArrayList(Index-Value))
&HashTable(Key-Value)
. Nach .NET framework 2.0ArrayList
&HashTable
ersetzt wurdenList
&Dictionary
. Nun, dieArraylist
&HashTable
sind nicht mehr in heutzutage Projekte.Kommen, um den Unterschied zwischen
HashTable
&Dictionary
,Dictionary
generisch ist, wo, wieHastable
ist nicht Generisch. Wir können hinzufügen, jede Art von Objekt zuHashTable
, aber beim abrufen, die wir brauchen, um cast in den gewünschten Typ. Also, es ist nicht typsicher. Aberdictionary
, während er erklärt sich können wir geben Sie den Typ des Schlüssel-und Wert -, so gibt es keine Notwendigkeit zu werfen, während das abrufen.Betrachten wir ein Beispiel:
HashTable
Wörterbuch,
Wörterbuch:
Es gibt/wirft Exception wenn wir versuchen, einen Schlüssel zu finden, der nicht existiert.
Es ist schneller als ein Hashtable, weil es kein boxing und unboxing.
Nur öffentlichen static-member sind thread-sicher.
Wörterbuch ist ein generischer Typ, was bedeutet, wir können es mit einem beliebigen Datentyp (Beim erstellen, müssen Sie die Datentypen für beide Schlüssel und Werte).
Beispiel:
Dictionary<string, string> <NameOfDictionaryVar> =
new Dictionary<string, string>();
Dictionay ist eine Typ-sichere Implementierung der Hashtable
Keys
undValues
sind stark typisiert.Hashtable:
Es gibt null zurück, wenn wir versuchen, einen Schlüssel zu finden, der nicht existiert.
Es ist langsamer als Wörterbuch, weil es erfordert, boxing und unboxing.
Allen Mitgliedern, die in einer Hashtable sind thread-sicher,
Hashtable ist nicht ein generischer Typ,
Hashtable ist lose typisierte Daten-Struktur, können wir hinzufügen von Schlüsseln und Werten beliebigen Typs.
Dictionary.TryGetValue
Den Umfassende Prüfung von Daten-Strukturen Mit C# Artikel auf MSDN besagt, dass es auch einen Unterschied in der collision resolution-Strategie:
Die Hashtable-Klasse verwendet eine Technik, genannt Aufwärmen.
Wörterbuch verwendet eine Technik, genannt Verkettung.
Da .NET Framework 3.5 gibt es auch eine
HashSet<T>
bietet alle Vorteile derDictionary<TKey, TValue>
wenn Sie müssen nur die Schlüssel und keine Werte.Also, wenn Sie einen
Dictionary<MyType, object>
- und immer setzen Sie den Wert aufnull
zu simulieren, die Art sicher hash-Tabelle, sollten Sie vielleicht erwägen, Umstellung auf dieHashSet<T>
.Den
Hashtable
ist eine lose typisierte Datenstruktur, so können Sie fügen Sie Schlüssel und Werte von jedem Typ derHashtable
. DieDictionary
Klasse ist eine Typ-sichereHashtable
Umsetzung, und die Schlüssel und Werte sind stark typisiert. Beim erstellen einerDictionary
Beispiel, müssen Sie die Datentypen für beide den Schlüssel und den Wert.Beachten Sie, dass MSDN sagt: "Dictionary<(Von <(TKey, TValue>)>) - Klasse umgesetzt Hashtabelle", nicht "Dictionary<(Von <(TKey, TValue>)>) - Klasse umgesetzt HashTable"
Wörterbuch ist NICHT implementiert als Hashtabelle, sondern es ist umgesetzt nach dem Konzept einer hash-Tabelle. Die Implementierung ist unabhängig von der HashTable-Klasse wegen der Verwendung von Generics, obwohl intern Microsoft hätte den gleichen code und ersetzt die Symbole von Object-Typ mit TKey und TValue.
In .NET 1.0 Generika nicht vorhanden sind; dies ist, wo die HashTable und ArrayList ursprünglich begann.
Einem Hashtable-Objekt besteht aus Eimern, enthalten die Elemente der Kollektion. Ein Eimer ist ein virtueller Untergruppe der Elemente in der Hashtable -, das macht die Suche und das abrufen einfacher und schneller als in den meisten Sammlungen.
Die Dictionary-Klasse hat die gleiche Funktionalität wie die Hashtable-Klasse. Ein Wörterbuch einer bestimmten Art (außer Object) hat eine bessere Leistung als eine Hashtable für value-Typen, da die Elemente der Hash-Tabelle sind vom Typ Object, und daher, boxing und unboxing in der Regel auftreten, wenn das speichern oder abrufen eines Wertes Typ.
Zur weiteren Lektüre: Hashtable-und Wörterbuch-Sammlung Arten
HashTable:
Schlüssel/Wert umgewandelt werden in ein Objekt (boxing) geben, während die Speicherung in den heap.
Schlüssel/Wert konvertiert werden muss, in den gewünschten Typ beim Lesen aus dem heap.
Diese Operationen sind sehr teuer. Wir müssen vermeiden, boxing/unboxing, so viel wie möglich.
Wörterbuch : Generische Variante von HashTable.
Kein boxing/unboxing. Keine Konvertierungen erforderlich.
Einen weiteren Unterschied, den ich herausfinden kann, ist:
Können wir nicht verwenden Dictionary<KT,VT - > (Generika) mit web-services. Der Grund ist kein web-service-standard unterstützt die standard-Generika.
Dictionary<>
ist ein generischer Typ und so ist es Typ-sicher.Können Sie einen beliebigen Wert geben Sie in der Hashtabelle, und dies kann manchmal eine Ausnahme. Aber
Dictionary<int>
akzeptieren nur integer-Werte und ebensoDictionary<string>
akzeptiert nur strings.So, es ist besser, verwenden Sie
Dictionary<>
stattHashTable
.Ein weiterer wichtiger Unterschied ist, dass die Hashtabelle ist thread-sicher. Hashtable hat built-in multiple-reader/single-writer (MR/SW), thread-Sicherheit, was bedeutet, Hashtable ermöglicht EIN Schriftsteller gemeinsam mit mehreren Lesern ohne Verriegelung.
Im Falle Wörterbuch es ist keine thread-Sicherheit; wenn Sie brauchen, thread-Sicherheit, müssen Sie eine eigene Synchronisierung implementieren.
Hilfe weitere:
Wenn Sie brauchen, geben Sicherheit und thread-Sicherheit, verwenden concurrent collections-Klassen in den .NET-Framework. Weiter Lesen hier.
Ein weiterer Unterschied ist, dass, wenn wir hinzufügen, die mehrere Einträge im Wörterbuch, in welcher Reihenfolge die Einträge Hinzugefügt werden, wird beibehalten. Wenn wir das abrufen der Elemente aus dem Wörterbuch bekommen wir die Datensätze in der gleichen Reihenfolge, die wir eingefügt haben, Sie. In der Erwägung, dass Hashtable-nicht beibehalten der insertion um.
Ich glaube nicht dass das unbedingt wahr ist, die meisten Sprachen haben eine oder das andere, je nachdem die die Terminologie, die Sie bevorzugen.
In C#, aber die klaren Grund (für mich) ist, dass C# Hashtabellen und andere Mitglieder des Systems.Collections-namespace, sind weitgehend obsolet. Sie waren in c# V1.1. Sie wurden ersetzt von C# 2.0 durch die Generischen Klassen in dem System.Sammlungen.Generic-namespace.
Nach dem, was ich sehe durch die Verwendung .NET Reflector:
Damit wir sicher sein können, dass DictionaryBase verwendet eine Hashtabelle intern.