Udostępnij za pośrednictwem


Typy kolekcji tablic skrótów i słowników

Klasa System.Collections.Hashtable oraz klasy ogólne System.Collections.Generic.Dictionary<TKey,TValue> i System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> implementują interfejs System.Collections.IDictionary. Klasa Dictionary<TKey,TValue> ogólna również implementuje interfejs ogólny IDictionary<TKey,TValue>. W związku z tym każdy element w tych kolekcjach jest parą klucz-wartość.

Obiekt Hashtable składa się z zasobników zawierających elementy kolekcji. Zasobnik to wirtualna podgrupa elementów w obiekcie Hashtable, która sprawia, że wyszukiwanie i pobieranie jest łatwiejsze i szybsze niż w większości kolekcji. Każdy zasobnik jest skojarzony z kodem skrótu, który jest generowany przy użyciu funkcji skrótu i jest oparty na kluczu elementu.

Klasa ogólna HashSet<T> to nieurządkowana kolekcja zawierająca unikatowe elementy.

Funkcja skrótu to algorytm, który zwraca kod skrótu liczbowego na podstawie klucza. Klucz jest wartością niektórych właściwości przechowywanego obiektu. Funkcja skrótu musi zawsze zwracać ten sam kod skrótu dla tego samego klucza. Funkcja skrótu może wygenerować ten sam kod skrótu dla dwóch różnych kluczy, ale funkcja skrótu, która generuje unikatowy kod skrótu dla każdego unikatowego klucza powoduje lepszą wydajność podczas pobierania elementów z tabeli skrótów.

Każdy obiekt używany jako element w Hashtable musi móc wygenerować kodu skrótu dla siebie przy użyciu implementacji metody GetHashCode. Można również określić funkcję skrótu dla wszystkich elementów w Hashtable przy użyciu Hashtable konstruktora, który akceptuje implementację IHashCodeProvider jako jeden z parametrów.

Po dodaniu obiektu do Hashtable, jest on przechowywany w koszu skojarzonym z kodem skrótu, który odpowiada kodowi skrótu obiektu. Gdy wartość jest wyszukiwana w elemecie Hashtable, kod skrótu jest generowany dla tej wartości, a zasobnik skojarzony z tym kodem skrótu jest przeszukiwany.

Na przykład funkcja skrótu dla ciągu może przyjmować kody ASCII każdego znaku w ciągu i dodać je razem, aby wygenerować kod skrótu. Ciąg "piknik" miałby kod skrótu, który różni się od kodu skrótu dla ciągu "koszyk"; w związku z tym ciągi "piknik" i "kosz" będą w różnych zasobnikach. Natomiast "zestresowane" i "desery" miałyby ten sam kod skrótu i byłyby w tym samym zasobniku.

Klasy Dictionary<TKey,TValue> i ConcurrentDictionary<TKey,TValue> mają takie same funkcje jak Hashtable klasa . Typ Dictionary<TKey,TValue> określony (inny niż Object) zapewnia lepszą wydajność niż Hashtable dla typów wartości. Jest to spowodowane tym, że elementy Hashtable są typu Object, dlatego gdy przechowujesz lub pobierasz typy wartości, zazwyczaj dochodzi do boxing i unboxing. Klasa ConcurrentDictionary<TKey,TValue> powinna być używana, gdy wiele wątków może uzyskiwać dostęp do kolekcji jednocześnie.

Zobacz także