Freigeben über


Hashtable-Auflistungstyp und Dictionary-Auflistungstyp

Die System.Collections.Hashtable-Klasse und die generische System.Collections.Generic.Dictionary<TKey, TValue>-Klasse und die generische System.Collections.Concurrent.ConcurrentDictionary<TKey, TValue>-Klasse implementieren die System.Collections.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.

Die generische HashSet<T>-Klasse ist eine ungeordnete Auflistung für eindeutige Elemente. Weitere Informationen zu dieser Auflistung finden Sie unter HashSet-Auflistungstyp.

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 und die ConcurrentDictionary<TKey, TValue>-Klasse verfügen über dieselbe Funktionalität wie die Hashtable-Klasse. Ein Dictionary<TKey, TValue> eines bestimmten Typs (außer Object) bietet eine bessere Leistung für Werttypen als eine Hashtable. Das liegt daran, dass die Elemente der Hashtable den Typ Object aufweisen. Boxing und Unboxing treten daher i. d. R. auf, wenn Sie einen Werttyp speichern oder abrufen. Wenn mehrere Threads möglicherweise gleichzeitig auf die Auflistung zugreifen, wird empfohlen, die ConcurrentDictionary<TKey, TValue>-Klasse zu verwenden.

Siehe auch

Referenz

Hashtable

IDictionary

IHashCodeProvider

Dictionary<TKey, TValue>

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

System.Collections.Concurrent.ConcurrentDictionary<TKey, TValue>

Konzepte

HashSet-Auflistungstyp

Weitere Ressourcen

Häufig verwendete Auflistungstypen