Sdílet prostřednictvím


Typy kolekce Hashtable a Dictionary

Třída System.Collections.Hashtable a System.Collections.Generic.Dictionary<TKey,TValue> System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> obecné třídy implementují System.Collections.IDictionary rozhraní. Obecná Dictionary<TKey,TValue> třída také implementuje IDictionary<TKey,TValue> obecné rozhraní. Každý prvek v těchto kolekcích je tedy pár klíč-hodnota.

Objekt Hashtable se skládá z kbelíků, které obsahují prvky kolekce. Kbelík je virtuální podskupina prvků v rámci Hashtable, která usnadňuje a načítá vyhledávání a načítání snadněji a rychleji než ve většině kolekcí. Každý kbelík je přidružený ke kódu hash, který se generuje pomocí funkce hash a je založen na klíči prvku.

Obecná HashSet<T> třída je neuspořádaná kolekce obsahující jedinečné prvky.

Hashovací funkce je algoritmus, který vrací číselný hashovací kód založený na klíči. Klíč je hodnota některé vlastnosti objektu, který se ukládá. Funkce hash musí vždy vrátit stejný kód hash pro stejný klíč. Je možné, že funkce hash vygeneruje stejný kód hash pro dva různé klíče, ale funkce hash, která vygeneruje jedinečný kód hash pro každý jedinečný klíč, má lepší výkon při načítání prvků z tabulky hash.

Každý objekt, který se používá jako prvek v objektu Hashtable musí být schopen vygenerovat hash kód pro sebe pomocí implementace GetHashCode metody. Pomocí konstruktoru, který přijímá IHashCodeProvider implementaci jako jeden z jeho parametrů, však můžete také zadat funkci hash pro všechny prvky v objektu.Hashtable Hashtable

Když je objekt přidán do objektu Hashtable, je uložen v kontejneru, který je přidružený k kódu hash, který odpovídá kódu hash objektu. Při hledání hodnoty v Hashtablekódu hash se pro tuto hodnotu vygeneruje kód hash a prohledá se kontejner přidružený k ho kódu hash.

Například funkce hash pro řetězec může vzít kódy ASCII každého znaku v řetězci a přidat je dohromady a vygenerovat hashovací kód. Řetězec "piknik" by měl kód hash, který se liší od kódu hash řetězce "basket"; proto řetězce "piknik" a "košík" budou v různých kbelíkech. Naproti tomu "stresované" a "dezerty" by měly stejný hash kód a byly by ve stejném kbelíku.

ConcurrentDictionary<TKey,TValue> Třídy Dictionary<TKey,TValue> mají stejné funkce jako třídaHashtable. A Dictionary<TKey,TValue> konkrétního typu (jiného než Object) poskytuje lepší výkon než Hashtable pro typy hodnot. Důvodem je to, že prvky Hashtable typu Object; proto boxování a rozbalení obvykle dochází při ukládání nebo načítání typu hodnoty. Třída ConcurrentDictionary<TKey,TValue> by se měla použít, když více vláken může současně přistupovat k kolekci.

Viz také