Warum wird Dictionary in C # Hashtable vorgezogen?

1395

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

Nakul Chaudhary
quelle
21
> Dies ist nicht unbedingt wahr. Eine Hash-Tabelle ist eine Implementierung eines Wörterbuchs. Ein typisches Beispiel, und es ist möglicherweise das Standardmodell in .NET, aber es ist per Definition nicht das einzige. Ich bin nicht sicher, ob dies vom ECMA-Standard verlangt wird, aber in der MSDN-Dokumentation wird sehr deutlich darauf hingewiesen, dass es als Hashtabelle implementiert ist. Sie bieten sogar die SortedList-Klasse für Zeiten, in denen eine Alternative sinnvoller ist.
Promit
15
@Promit Ich dachte immer, das wäre Dictionaryeine Implementierung des Hashtable.
b1nary.atr0phy
2
Ich denke, der Grund ist, dass Sie in einem Wörterbuch den Typ des Schlüssels und den Wert für sich selbst definieren können. Die Hashtabelle kann nur Objekte aufnehmen und speichert die Paare basierend auf dem Hash (von object.GetHashCode ()).
Radinator
2
@Dan Ihre Behauptung ist ziemlich falsch ... Eine Hash-Tabelle enthält nur eine Instanz jedes Schlüssels, und eine Suche liefert niemals mehrere Einträge. Wenn Sie jedem Schlüssel mehrere Werte zuordnen möchten, machen Sie den Wert der Hash-Tabelle zu einer Liste von Werten. Es gibt keine Datenstruktur wie "ein Wörterbuch" ... Wörterbuch ist einfach der Name, den einige Bibliotheken für ihre Hash-Tabelle verwenden. Beispielsweise wird die nicht generische Hash-Tabelle von C # aufgerufen HashTable. Wenn sie der Sprache Generika hinzufügten, nannten sie die generische Version Dictionary. Beide sind Hash-Tabellen.
Jim Balter
3
@Dan Ihre Behauptung ist falsch ... eine Hash-Tabelle ( en.wikipedia.org/wiki/Hash_table ) ist eine bestimmte Implementierung eines Wörterbuchs, auch bekannt als assoziatives Array ( en.wikipedia.org/wiki/Associative_array ), und Ein Wörterbuch enthält nur eine Instanz jedes Schlüssels, und eine Suche liefert niemals mehrere Einträge. Wenn Sie jedem Schlüssel mehrere Werte zuordnen möchten, machen Sie den Wert der Hash-Tabelle zu einer Liste von Werten. Die Klassen .NET Dictionary und Hashtable sind beide Hash-Tabellen.
Jim Balter

Antworten:

1568

Für was es wert ist , ein Wörterbuch ist (konzeptuell) eine Hash - Tabelle.

Wenn Sie meinten "Warum verwenden wir die Dictionary<TKey, TValue>Klasse anstelle der HashtableKlasse?", Dann ist es eine einfache Antwort: Ist Dictionary<TKey, TValue>ein generischer Typ, Hashtablenicht. Das bedeutet, dass Sie Typensicherheit erhalten Dictionary<TKey, TValue>, da Sie kein zufälliges Objekt einfügen können und die herausgenommenen Werte nicht umwandeln müssen.

Interessanterweise Dictionary<TKey, TValue>basiert die Implementierung in .NET Framework auf dem Hashtable, wie Sie diesem Kommentar im Quellcode entnehmen können:

Das generische Wörterbuch wurde aus der Quelle von Hashtable kopiert

Quelle

Michael Madsen
quelle
393
Und auch generische Sammlungen sind viel schneller, da es kein Boxen / Unboxen gibt
Chris S
6
Ich bin mir nicht sicher über eine Hashtable mit der obigen Aussage, aber für ArrayList vs List <t> ist es wahr
Chris S
36
Hashtable verwendet Object, um Dinge intern zu halten (nur nicht generische Methode, um dies zu tun), sodass es auch boxen / unboxen müsste.
Guvante
16
@BrianJ: Eine "Hash-Tabelle" (zwei Wörter) ist der Informatikbegriff für diese Art von Struktur; Dictionary ist eine spezifische Implementierung. Eine HashTable entspricht in etwa einem Dictionary <Objekt, Objekt> (allerdings mit leicht unterschiedlichen Schnittstellen), aber beide sind Implementierungen des Hash-Tabellenkonzepts. Und natürlich, um die Sache noch weiter zu verwirren, nennen einige Sprachen ihre Hash-Tabellen "Wörterbücher" (z. B. Python) - aber der richtige CS-Begriff ist immer noch Hash-Tabelle.
Michael Madsen
32
@BrianJ: Sowohl HashTable(Klasse) als auch Dictionary(Klasse) sind Hash-Tabellen (Konzept), aber a HashTableist weder a Dictionarynoch Dictionarya HashTable. Sie werden auf sehr ähnliche Dictionary<Object,Object>Weise verwendet und können auf dieselbe untypisierte Weise wie a agieren HashTable, teilen jedoch keinen Code direkt (obwohl Teile wahrscheinlich auf sehr ähnliche Weise implementiert werden).
Michael Madsen
625

Dictionary<<< >>> HashtableUnterschiede:

  • Generisch <<< >>> Nicht generisch
  • Benötigt eigene Thread-Synchronisation <<< >>> Bietet eine thread-sichere Version über die Synchronized()Methode
  • Aufzählungselement: KeyValuePair<<< >>> Aufzählungselement:DictionaryEntry
  • Neuere (> .NET 2.0 ) <<< >>> Älter (seit .NET 1.0 )
  • befindet sich in System.Collections.Generic <<< >>> befindet sich in System.Collections
  • Anforderung an nicht vorhandenen Schlüssel löst Ausnahme aus <<< >>> Anforderung an nicht vorhandenen Schlüssel gibt null zurück
  • möglicherweise etwas schneller für Werttypen <<< >>> etwas langsamer (erfordert Boxing / Unboxing) für Werttypen

Dictionary/ HashtableÄhnlichkeiten:

  • Bei beiden handelt es sich um interne Hashtabellen == schneller Zugriff auf Daten mit vielen Elementen gemäß Schlüssel
  • Beide benötigen unveränderliche und eindeutige Schlüssel
  • Schlüssel von beiden benötigen eine eigene GetHashCode()Methode

Ähnliche .NET-Sammlungen (Kandidaten, die anstelle von Dictionary und Hashtable verwendet werden sollen):

  • ConcurrentDictionary- Thread-sicher (kann von mehreren Threads gleichzeitig sicher aufgerufen werden)
  • HybridDictionary- optimierte Leistung (für wenige Artikel und auch für viele Artikel)
  • OrderedDictionary- Auf Werte kann über den int-Index zugegriffen werden (in der Reihenfolge, in der die Elemente hinzugefügt wurden).
  • SortedDictionary- Artikel automatisch sortiert
  • StringDictionary- stark typisiert und für Strings optimiert
Marcel Toth
quelle
11
@ Guillaume86, aus diesem Grund verwenden Sie TryGetValue anstelle von msdn.microsoft.com/en-us/library/bb347013.aspx
Trident D'Gao
2
+1 für StringDictionary... ist übrigens StringDictionarynicht dasselbe wie Dictionary<string, string>bei Verwendung des Standardkonstruktors.
Cheng Chen
Das ParallelExtensionsExtras @ code.msdn.microsoft.com/windowsdesktop/… enthält ein ObservableConcurrentDictionary, das sowohl eine hervorragende Bindung als auch Parallelität bietet .
VoteCoffee
3
Tolle Erklärung, es ist wirklich schön, dass Sie auch die Ähnlichkeiten aufgelistet haben, um die Fragen zu verringern, die einem in den Sinn kommen könnten
mkb
178

Da Dictionaryeine generische Klasse (ist Dictionary<TKey, TValue>), so dass sein Inhalt ist der Zugriff auf typsicher (dh Sie nicht gegossen aus benötigen Object, wie Sie mit einem zu tun Hashtable).

Vergleichen Sie

var customers = new Dictionary<string, Customer>();
...
Customer customer = customers["Ali G"];

zu

var customers = new Hashtable();
...
Customer customer = customers["Ali G"] as Customer;

Jedoch Dictionarywird als Hash - Tabelle intern implementiert, so technisch funktioniert es genauso.

gius
quelle
88

Zu Ihrer Information: In .NET Hashtableist es threadsicher für die Verwendung durch mehrere Reader-Threads und einen einzelnen Schreibthread, während in Dictionaryöffentlichen statischen Mitgliedern threadsicher sind, aber nicht garantiert wird, dass Instanzmitglieder threadsicher sind.

Aus Hashtablediesem Grund mussten wir alle unsere Wörterbücher wieder ändern .

user38902
quelle
10
Spaß. Der Dictionary <T> -Quellcode sieht viel sauberer und schneller aus. Es ist möglicherweise besser, Dictionary zu verwenden und eine eigene Synchronisierung zu implementieren. Wenn die Lesevorgänge des Wörterbuchs unbedingt aktuell sein müssen, müssen Sie lediglich den Zugriff auf die Lese- / Schreibmethoden des Wörterbuchs synchronisieren. Es wäre viel Sperren, aber es wäre richtig.
Triynko
10
Wenn Ihre Lesevorgänge nicht unbedingt aktuell sein müssen, können Sie das Wörterbuch alternativ als unveränderlich behandeln. Sie können dann einen Verweis auf das Wörterbuch abrufen und die Leistung steigern, indem Sie die Lesevorgänge überhaupt nicht synchronisieren (da es unveränderlich und von Natur aus threadsicher ist). Um es zu aktualisieren, erstellen Sie im Hintergrund eine vollständig aktualisierte Kopie des Wörterbuchs und tauschen dann einfach die Referenz mit Interlocked.CompareExchange aus (unter der Annahme eines einzelnen Schreibthreads; für mehrere Schreibthreads müssten die Aktualisierungen synchronisiert werden).
Triynko
38
.Net 4.0 hat das hinzugefügt ConcurrentDictionary Klasse alle öffentlichen / geschützten Methoden threadsicher implementiert sind. Wenn Sie keine älteren Plattformen unterstützen müssen, können Sie den HashtableMultithread-Code ersetzen : msdn.microsoft.com/en-us/library/dd287191.aspx
Dan spielt
anonym zur Rettung. Coole Antwort.
Unkulunkulu
5
Ich erinnere mich, dass ich gelesen habe, dass HashTable nur in dem Szenario threadsicher ist, in dem Informationen niemals aus der Tabelle gelöscht werden. Wenn ein Leser nach einem Element fragt, das sich in der Tabelle befindet, während ein anderes Element gelöscht wird, und der Leser an mehr als einer Stelle nach dem Element suchen möchte, ist es möglich, dass der Verfasser das Element während der Suche des Lesers möglicherweise verschiebt von einem Ort, der nicht untersucht wurde, zu einem Ort, der nicht untersucht wurde, was zu einer falschen Meldung führt, dass der Gegenstand nicht existiert.
Supercat
68

In .NET besteht der Unterschied zwischen Dictionary<,>und HashTablein erster Linie darin, dass es sich bei dem ersteren um einen generischen Typ handelt. Sie erhalten also alle Vorteile von Generika in Bezug auf die statische Typprüfung (und das reduzierte Boxen), aber dies ist nicht so groß, wie die Leute denken Leistungsbedingungen - das Boxen verursacht jedoch bestimmte Speicherkosten.

Marc Gravell
quelle
34

Die Leute sagen, dass ein Wörterbuch dasselbe ist wie eine Hash-Tabelle.

Dies ist nicht unbedingt wahr. Eine Hash-Tabelle ist eine Möglichkeit, ein Wörterbuch zu implementieren . Ein typischer, und es kann der Standard in .NET in der seinDictionary Klasse, aber es ist per Definition nicht das einzige.

Sie könnten ein Wörterbuch genauso gut mithilfe einer verknüpften Liste oder eines Suchbaums implementieren, es wäre einfach nicht so effizient (für eine Metrik der Effizienz).

rix0rrr
quelle
4
In MS-Dokumenten heißt es: "Das Abrufen eines Werts mithilfe seines Schlüssels ist sehr schnell und liegt nahe bei O (1), da die Klasse Dictionary <(Of <(TKey, TValue>)>) als Hash-Tabelle implementiert ist." - Sie sollten also eine Hashtabelle im Umgang mit garantiert haben Dictionary<K,V>. IDictionary<K,V>könnte aber alles sein :)
Snemarch
13
@ rix0rrr - Ich denke, Sie haben das rückwärts, ein Wörterbuch verwendet eine HashTable, keine HashTable verwendet ein Wörterbuch.
Joseph Hamilton
8
@JosephHamilton - rix0rrr hat es richtig gemacht: "Eine Hash-Tabelle ist eine Implementierung eines Wörterbuchs ." Er meint das Konzept "Wörterbuch", nicht die Klasse (beachten Sie die Kleinbuchstaben). Konzeptionell implementiert eine Hash-Tabelle eine Wörterbuchschnittstelle. In .NET verwendet Dictionary eine Hash-Tabelle, um IDictionary zu implementieren. Es ist chaotisch;)
Robert Hensing
Ich habe in .NET darüber gesprochen, da er in seiner Antwort darauf verwiesen hat.
Joseph Hamilton
2
@JosephHamilton: Implementierungen (oder Implementierungen von ) bedeuten nicht einmal aus der Ferne dasselbe wie Verwendungen . Ganz im Gegenteil. Vielleicht wäre es klarer gewesen, wenn er es etwas anders gesagt hätte (aber mit der gleichen Bedeutung): "Eine Hash-Tabelle ist eine Möglichkeit, ein Wörterbuch zu implementieren". Das heißt, wenn Sie die Funktionalität eines Wörterbuchs nutzen möchten, besteht eine Möglichkeit, dies zu tun ( um das Wörterbuch zu implementieren ) darin, eine Hashtabelle zu verwenden.
ToolmakerSteve
21

Collections& Genericssind nützlich für die Behandlung von Objektgruppen. In .NET befinden sich alle Sammlungsobjekte unter der Schnittstelle IEnumerable, die wiederum über ArrayList(Index-Value))& verfügt HashTable(Key-Value). Nach .NET Framework 2.0 wurden ArrayList& HashTabledurch List& ersetzt Dictionary. Jetzt werden die Arraylist& HashTablein heutigen Projekten nicht mehr verwendet.

Der Unterschied zwischen HashTable& Dictionary, Dictionaryist generisch, wo Hastablenicht generisch ist. Wir können jedem Objekttyp hinzufügen HashTable, aber beim Abrufen müssen wir ihn in den gewünschten Typ umwandeln. Es ist also nicht typsicher. Aber dictionary, während sich erklären wir die Art von Schlüssel und Wert angeben können, so gibt es keine Notwendigkeit, Guss beim Abrufen.

Schauen wir uns ein Beispiel an:

Hash-tabelle

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);
        }
    }
}
Sujit
quelle
2
Anstatt den Datentyp für KeyValuePair explizit zuzuweisen, könnten wir var verwenden. Dies würde also die Eingabe reduzieren - foreach (var kv in dt) ... nur ein Vorschlag.
Ron
16

Wörterbuch:

  • Es gibt eine Ausnahme zurück / löst eine Ausnahme aus, wenn wir versuchen, einen Schlüssel zu finden, der nicht existiert.

  • Es ist schneller als ein Hashtable, da es kein Boxen und Unboxing gibt.

  • Nur öffentliche statische Mitglieder sind threadsicher.

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

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

  • Dictionay ist eine typsichere Implementierung von Hashtable Keysund Valuesstark typisiert.

Hash-tabelle:

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

  • Es ist langsamer als das Wörterbuch, da es das Ein- und Auspacken erfordert.

  • Alle Mitglieder in einer Hashtabelle sind threadsicher.

  • Hashtable ist kein generischer Typ.

  • Hashtable ist eine lose typisierte Datenstruktur. Wir können Schlüssel und Werte jedes Typs hinzufügen.

Altaf Patel
quelle
"Es gibt eine Ausnahme zurück / löst eine Ausnahme aus, wenn wir versuchen, einen Schlüssel zu finden, der nicht existiert." Nicht wenn Sie verwendenDictionary.TryGetValue
Jim Balter
16

Die ausführliche Untersuchung von Datenstrukturen mithilfe des C # -Artikels zu MSDN besagt, dass es auch einen Unterschied in der Strategie zur Kollisionsauflösung gibt :

Die Hashtable-Klasse verwendet eine Technik, die als Aufwärmen bezeichnet wird .

Das Aufwärmen funktioniert wie folgt: Es gibt eine Reihe verschiedener Hash-Funktionen, H 1 ... H n , und beim Einfügen oder Abrufen eines Elements aus der Hash-Tabelle wird zunächst die H 1- Hash-Funktion verwendet. Wenn dies zu einer Kollision führt, wird stattdessen H 2 versucht und bei Bedarf bis zu H n .

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

Beim erneuten Aufwärmen wird im Falle einer Kollision der Hash neu berechnet und der neue Slot, der einem Hash entspricht, versucht. Bei der Verkettung wird jedoch eine sekundäre Datenstruktur verwendet, um etwaige Kollisionen zu halten . Insbesondere verfügt jeder Steckplatz im Wörterbuch über ein Array von Elementen, die diesem Bucket zugeordnet sind. Im Falle einer Kollision wird das kollidierende Element der Liste des Buckets vorangestellt.

alexandrekow
quelle
16

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

Wenn Sie also a verwenden Dictionary<MyType, object>und den Wert immer so einstellen, dass die nulltypsichere Hash-Tabelle simuliert wird, sollten Sie möglicherweise in Betracht ziehen, auf die zu wechseln HashSet<T>.

Oliver
quelle
14

Dies Hashtableist eine lose typisierte Datenstruktur, sodass Sie dem Schlüssel Schlüssel und Werte eines beliebigen Typs hinzufügen können Hashtable. Die DictionaryKlasse ist eine typsichere HashtableImplementierung, und die Schlüssel und Werte sind stark typisiert. Beim Erstellen einer DictionaryInstanz müssen Sie die Datentypen sowohl für den Schlüssel als auch für den Wert angeben.

Fleisch
quelle
11

Beachten Sie, dass MSDN sagt: "Dictionary <(Of <(TKey, TValue>)>) Klasse ist als Hash-Tabelle implementiert ", nicht "Dictionary <(Of <(TKey, TValue>)>) Klasse ist als HashTable implementiert ".

Dictionary wird NICHT als HashTable implementiert, sondern nach dem Konzept einer Hash-Tabelle. Die Implementierung hat aufgrund der Verwendung von Generics keine Beziehung zur HashTable-Klasse, obwohl Microsoft intern denselben Code hätte verwenden und die Symbole vom Typ Object durch TKey und TValue ersetzen können.

In .NET 1.0 gab es keine Generika. Hier begannen ursprünglich HashTable und ArrayList.

Brant
quelle
Können Sie das MSDN-Angebot korrigieren? Etwas fehlt oder stimmt nicht; es ist nicht grammatikalisch und etwas unverständlich.
Peter Mortensen
10

Hash-tabelle:

Schlüssel / Wert werden beim Speichern im Heap in einen Objekttyp (Boxing) konvertiert.

Schlüssel / Wert muss beim Lesen vom Heap in den gewünschten Typ konvertiert werden.

Diese Operationen sind sehr kostspielig. Wir müssen das Boxen / Unboxen so weit wie möglich vermeiden.

Wörterbuch: Generische Variante von HashTable.

Kein Boxen / Unboxen. Keine Konvertierungen erforderlich.

Siva Sankar Gorantla
quelle
8

Ein Hashtable-Objekt besteht aus Buckets, die die Elemente der Sammlung enthalten. Ein Bucket ist eine virtuelle Untergruppe von Elementen in der Hashtabelle, wodurch das Suchen und Abrufen einfacher und schneller ist als in den meisten Sammlungen .

Die Dictionary-Klasse hat dieselbe Funktionalität wie die Hashtable-Klasse. Ein Wörterbuch eines bestimmten Typs (außer Objekt) bietet eine bessere Leistung als eine Hashtabelle für auf, da die Elemente der Hashtabelle vom Typ Objekt sind und daher beim Speichern oder Abrufen eines Werttyps normalerweise Boxing und Unboxing auftreten.

Weitere Informationen : Hashtable- und Dictionary-Auflistungstypen

mparkuk
quelle
7

Ein weiterer wichtiger Unterschied ist, dass Hashtable threadsicher ist. Hashtable verfügt über eine integrierte Thread-Sicherheit für mehrere Leser / einzelne Schreiber (MR / SW), was bedeutet, dass Hashtable EINEN Schreiber zusammen mit mehreren Lesern ohne Sperren ermöglicht.

Im Fall von Dictionary gibt es keine Thread-Sicherheit; Wenn Sie Thread-Sicherheit benötigen, müssen Sie Ihre eigene Synchronisation implementieren.

Um weiter auszuarbeiten:

Hashtable bietet etwas Thread-Sicherheit durch die Synchronized Eigenschaft , die einen thread-sicheren Wrapper um die Sammlung zurückgibt. Der Wrapper sperrt die gesamte Sammlung bei jedem Hinzufügen oder Entfernen. Daher muss jeder Thread, der versucht, auf die Sammlung zuzugreifen, warten, bis er an der Reihe ist, um die eine Sperre zu erhalten. Dies ist nicht skalierbar und kann bei großen Sammlungen zu erheblichen Leistungseinbußen führen. Auch das Design ist nicht vollständig vor Rennbedingungen geschützt.

Die .NET Framework 2.0-Auflistungsklassen wie List<T>, Dictionary<TKey, TValue>usw. bieten keine Thread-Synchronisierung. Der Benutzercode muss die gesamte Synchronisierung bereitstellen, wenn Elemente in mehreren Threads gleichzeitig hinzugefügt oder entfernt werden

Wenn Sie sowohl Typensicherheit als auch Thread-Sicherheit benötigen, verwenden Sie gleichzeitige Sammlungsklassen in .NET Framework. Lesen Sie hier weiter .

Ein zusätzlicher Unterschied besteht darin, dass beim Hinzufügen mehrerer Einträge im Wörterbuch die Reihenfolge beibehalten wird, in der die Einträge hinzugefügt werden. Wenn wir die Elemente aus dem Wörterbuch abrufen, erhalten wir die Datensätze in der Reihenfolge, in der wir sie eingefügt haben. Während Hashtable die Einfügereihenfolge nicht beibehält.

NullReference
quelle
Soweit ich weiß , Hashsetgarantiert dies die Sicherheit von MR / SW-Threads in Nutzungsszenarien, in denen keine Löschvorgänge erforderlich sind . Ich denke, es war möglicherweise beabsichtigt, vollständig MR / SW-sicher zu sein, aber die sichere Behandlung von Löschungen erhöht die Kosten für die MR / SW-Sicherheit erheblich. Während das Design von DictionaryMR / SW-Sicherheit in Szenarien ohne Löschung zu minimalen Kosten hätte bieten können, wollte MS meiner Meinung nach vermeiden, Szenarien ohne Löschung als "speziell" zu behandeln.
Supercat
5

Ein weiterer Unterschied, den ich herausfinden kann, ist:

Wir können Dictionary <KT, VT> (Generika) nicht mit Webdiensten verwenden. Der Grund dafür ist, dass kein Webdienststandard den Generika-Standard unterstützt.

Peter Mortensen
quelle
Wir können generische Listen (List <string>) in seifenbasierten Webdiensten verwenden. Wir können jedoch kein Wörterbuch (oder keine Hashtabelle) in einem Webservice verwenden. Ich denke, der Grund dafür ist, dass der .net xmlserializer kein Wörterbuchobjekt verarbeiten kann.
Siddharth
5

Dictionary<> ist ein generischer Typ und daher typsicher.

Sie können einen beliebigen Werttyp in HashTable einfügen, was manchmal eine Ausnahme auslöst. Dictionary<int>Akzeptiert aber nur ganzzahlige Werte und ähnlichDictionary<string> wird nur Strings akzeptieren.

Es ist also besser, Dictionary<>statt zu verwenden HashTable.

Kishore Kumar
quelle
0

In den meisten Programmiersprachen werden Wörterbücher Hashtabellen vorgezogen

Ich denke nicht, dass dies unbedingt wahr ist, die meisten Sprachen haben die eine oder andere, abhängig von der Terminologie, die sie bevorzugen .

In C # ist der klare Grund (für mich) jedoch, dass C # HashTables und andere Mitglieder des System.Collections-Namespace weitgehend veraltet sind. Sie waren in c # V1.1 vorhanden. Sie wurden von C # 2.0 durch die generischen Klassen im System.Collections.Generic-Namespace ersetzt.

kristianp
quelle
Einer der Vorteile einer Hashtabelle gegenüber einem Wörterbuch besteht darin, dass ein Fehler ausgelöst wird, wenn ein Schlüssel in einem Wörterbuch nicht vorhanden ist. Wenn ein Schlüssel in einer Hashtabelle nicht vorhanden ist, wird nur null zurückgegeben.
Bill Norman
In C # würde ich die Verwendung von System.Collections.Hashtable immer noch vermeiden, da sie nicht den Vorteil von Generika haben. Sie können TryGetValue oder HasKey von Dictionary verwenden, wenn Sie nicht wissen, ob der Schlüssel vorhanden ist.
Kristianp
Hoppla, nicht HasKey, es sollte ContainsKey sein.
Kristianp
-3

Nach dem, was ich mit .NET Reflector sehe :

[Serializable, ComVisible(true)]
public abstract class DictionaryBase : IDictionary, ICollection, IEnumerable
{
    // Fields
    private Hashtable hashtable;

    // Methods
    protected DictionaryBase();
    public void Clear();
.
.
.
}
Take note of these lines
// Fields
private Hashtable hashtable;

So können wir sicher sein, dass DictionaryBase intern eine HashTable verwendet.

Peter Mortensen
quelle
16
System.Collections.Generic.Dictionary <TKey, TValue> leitet sich nicht von DictionaryBase ab.
Snemarch
"So können wir sicher sein, dass DictionaryBase intern eine HashTable verwendet." - Das ist schön, hat aber nichts mit der Frage zu tun.
Jim Balter