Freigeben über


Hashtable-Auflistungstyp und Dictionary-Auflistungstyp

Aktualisiert: November 2007

Die Hashtable-Klasse und die generische Dictionary<TKey, TValue>-Klasse implementieren die IDictionary-Schnittstelle. Die generische Dictionary<TKey, TValue>-Klasse implementiert zusätzlich die generische IDictionary<TKey, TValue>-Schnittstelle. Deshalb entspricht jedes Element in diesen Auflistungen einem Schlüssel/Wert-Paar.

Ein Hashtable-Objekt besteht aus Buckets, die die Elemente der Auflistung enthalten. Buckets sind virtuelle Untergruppen von Elementen innerhalb der Hashtable, in denen das Suchen und Abrufen schneller und einfacher vonstatten geht als in den meisten Auflistungen. Jedem Bucket ist ein Hashcode zugeordnet, der mithilfe einer Hashfunktion generiert wird und auf dem Schlüssel des Elements basiert.

Eine Hashfunktion ist ein Algorithmus, der einen numerischen Hashcode zurückgibt, der auf einem Schlüssel basiert. Der Schlüssel ist der Wert einer Eigenschaft des gespeicherten Objekts. Eine Hashfunktion muss immer denselben Hashcode für denselben Schlüssel zurückgeben. Eine Hashfunktion kann in der Lage sein, denselben Hashcode für zwei verschiedene Schlüssel zu generieren, aber eine Hashfunktion, die einen eindeutigen Hashcode für jeden Schlüssel generiert, hat ein besseres Leistungsverhalten beim Abrufen von Elementen aus der Hashtabelle.

Jedes in Hashtable als Element verwendetes Objekt muss mithilfe einer Implementierung der GetHashCode-Methode einen Hashcode für sich selbst generieren können. Sie können jedoch auch eine Hashfunktion für alle Elemente in Hashtable festlegen, indem Sie einen Hashtable-Konstruktor festlegen, der eine IHashCodeProvider-Implementierung als einen seiner Parameter akzeptiert.

Wenn einer Hashtable ein Objekt hinzugefügt wird, wird es in dem Bucket gespeichert, dessen Hashcode mit dem Hashcode des Objekts übereinstimmt. Wenn in der Hashtable nach einem Wert gesucht wird, wird der Hashcode für diesen Wert generiert. Außerdem wird nach dem mit diesem Hashcode übereinstimmenden Bucket gesucht.

Eine Hashfunktion für eine Zeichenfolge könnte beispielsweise die ASCII-Codes jedes Zeichens der Zeichenfolge verwenden, um aus dem Zusammenfügen dieser Codes einen Hashcode zu generieren. Die Zeichenfolge "Picknick" hätte einen anderen Hashcode als die Zeichenfolge "Korb". Daher werden die Zeichenfolgen "Picknick" und "Korb" in verschiedenen Buckets untergebracht. Im Gegensatz dazu hätten die Zeichenfolgen "Lampe" und "Palme" denselben Hashcode und wären daher im selben Bucket gespeichert.

Die Dictionary<TKey, TValue>-Klasse verfügt über dieselbe Funktionalität wie die Hashtable-Klasse. Ein Dictionary<TKey, TValue> eines bestimmten Typs (außer Object) ist bei Wertetypen leistungsfähiger als Hashtable, da die Elemente von Hashtable den Typ Object aufweisen. Daher wird beim Speichern oder Abrufen eines Werttyps normalerweise ein Boxing oder Unboxing vorgenommen.

Siehe auch

Referenz

Hashtable

IDictionary

IHashCodeProvider

Dictionary<TKey, TValue>

System.Collections.Generic.IDictionary<TKey, TValue>

Weitere Ressourcen

Häufig verwendete Auflistungstypen