Freigeben über


Hashtable-Auflistungstyp und Dictionary-Auflistungstyp

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

Ein Hashtable-Objekt besteht aus Behältern, die die Elemente der Sammlung enthalten. Ein Bucket ist eine virtuelle Untergruppe von Elementen innerhalb des HashtableBereichs, wodurch die Suche und das Abrufen einfacher und schneller als in den meisten Sammlungen erleichtert wird. Jeder Bucket ist einem 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, die eindeutige Elemente enthält.

Eine Hashfunktion ist ein Algorithmus, der einen numerischen Hashcode basierend auf einem Schlüssel 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 denselben Hashcode für zwei verschiedene Schlüssel generiert, aber eine Hashfunktion, die einen eindeutigen Hashcode für jeden eindeutigen Schlüssel generiert, führt zu einer besseren Leistung beim Abrufen von Elementen aus der Hashtabelle.

Jedes Objekt, das als Element in einem Hashtable Objekt verwendet wird, 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 einem Hashtable Element angeben, indem Sie einen Hashtable Konstruktor verwenden, der eine IHashCodeProvider Implementierung als einen seiner Parameter akzeptiert.

Wenn ein Objekt einem HashtableObjekt hinzugefügt wird, wird es im Bucket gespeichert, der dem Hashcode zugeordnet ist, der dem Hashcode des Objekts entspricht. Wenn ein Wert im HashtableBereich durchsucht wird, wird der Hashcode für diesen Wert generiert, und der bucket, der diesem Hashcode zugeordnet ist, wird durchsucht.

Beispielsweise kann eine Hashfunktion für eine Zeichenfolge die ASCII-Codes jedes Zeichens in der Zeichenfolge übernehmen und zusammen hinzufügen, um einen Hashcode zu generieren. Die Zeichenfolge "picknick" hätte einen Hashcode, der sich vom Hashcode für die Zeichenfolge "basket" unterscheidet; daher wären die Zeichenfolgen "Picknick" und "Korb" in verschiedenen Buckets. Im Gegensatz dazu weisen "nie" und "ein" den gleichen Hashcode auf und befinden sich im gleichen Bucket.

Die Dictionary<TKey,TValue>- und ConcurrentDictionary<TKey,TValue>-Klassen haben die gleiche Funktionalität wie die Hashtable-Klasse. Ein Dictionary<TKey,TValue> eines bestimmten Typs (außer Object) bietet eine bessere Leistung als ein Hashtable bei 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 ConcurrentDictionary<TKey,TValue> Klasse sollte verwendet werden, wenn mehrere Threads gleichzeitig auf die Auflistung zugreifen.

Siehe auch