Freigeben über


Hashtable-Auflistungstyp und Dictionary-Auflistungstyp

Die Klasse System.Collections.Hashtable und die generischen Klassen System.Collections.Generic.Dictionary<TKey,TValue> und System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> implementieren die System.Collections.IDictionary-Schnittstelle. Die generische Klasse Dictionary<TKey,TValue> implementiert außerdem die generische IDictionary<TKey,TValue>-Schnittstelle. Daher ist jedes Element in diesen Auflistungen ein Schlüssel-Wert-Paar.

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

Die generische Klasse HashSet<T> ist eine ungeordnete Auflistung für eindeutige Elemente.

Eine Hashfunktion ist ein Algorithmus, der einen numerischen Hashcode anhand eines Schlüssels zurückgibt. Der Schlüssel ist der Wert einer Eigenschaft des Objekts, das gespeichert wird. Eine Hashfunktion muss immer denselben Hashcode für denselben Schlüssel zurückgeben. Es ist möglich, dass eine Hashfunktion, den gleichen Hashcode für zwei verschiedene Schlüssel generiert. Eine Hashfunktion, die einen eindeutigen Hashcode für jeden eindeutigen Schlüssel generiert, führt jedoch zu besserer Leistung beim Abrufen von Elementen aus der Hashtabelle.

Jedes Objekt, das als ein Element in einer Hashtable verwendet wird, muss in der Lage sein, einen Hashcode für sich selbst zu generieren, indem eine Implementierung der Methode GetHashCode verwendet wird. Allerdings können Sie auch eine Hashfunktion für alle Elemente in einer Hashtable mithilfe eines Hashtable-Konstruktors angeben, der eine IHashCodeProvider-Implementierung als einen seiner Parameter akzeptiert.

Wenn ein Objekt einer Hashtable hinzugefügt wird, wird es in dem Bucket gespeichert, der dem Hashcode zugeordnet ist, der mit dem Hashcode des Objekts übereinstimmt. Wenn in der Hashtable nach einem Wert gesucht wird, wird der Hashcode für diesen Wert generiert, dann wird der diesem Hashcode zugeordnete Bucket durchsucht.

Eine Hashfunktion für eine Zeichenfolge kann z. B. die ASCII-Codes jedes Zeichens in der Zeichenfolge annehmen und sie dann zusammen hinzufügen, um einen Hashcode zu generieren. Die Zeichenfolge "Segel" besitzt z. B. einen anderen Hashcode als die Zeichenfolge "Seife". Daher werden die Zeichenfolgen "Segel" und "Seife" in verschiedenen Buckets gespeichert. Im Gegensatz dazu weisen "nie" und "ein" den gleichen Hashcode auf und befinden sich im gleichen Bucket.

Die Klassen Dictionary<TKey,TValue> und ConcurrentDictionary<TKey,TValue> weisen die gleiche Funktionalität wie die Klasse Hashtable auf. Ein Dictionary<TKey,TValue> eines bestimmten Typs (außer Object) bietet eine bessere Leistung als eine Hashtable für Werttypen. Der Grund hierfür ist, dass die Elemente von Hashtable vom Typ Object sind. Daher treten das Boxing und das Unboxing in der Regel beim Speichern oder Abrufen eines Werttyps auf. Die Klasse ConcurrentDictionary<TKey,TValue> sollte verwendet werden, wenn mehrere Threads möglicherweise gleichzeitig auf die Auflistung zugreifen.

Siehe auch