Typy kolekcji tablic wartości funkcji mieszającej i słowników
Klasa System.Collections.Hashtable i System.Collections.Generic.Dictionary<TKey,TValue> System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> klasy ogólne implementują System.Collections.IDictionary interfejs. Klasa Dictionary<TKey,TValue> ogólna implementuje IDictionary<TKey,TValue> również interfejs ogólny. 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 obiekcie Hashtable musi mieć możliwość wygenerowania kodu skrótu dla siebie przy użyciu implementacji GetHashCode metody . Można jednak również określić funkcję skrótu dla wszystkich elementów w Hashtable obiekcie przy użyciu Hashtable konstruktora, który akceptuje implementację IHashCodeProvider jako jeden z jego parametrów.
Po dodaniu obiektu do Hashtableobiektu jest on przechowywany w zasobniku skojarzonym z kodem skrótu zgodnym z kodem 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ą Hashtable wydajność niż dla typów wartości. Jest to spowodowane tym, że elementy typu Hashtable są typu Object, dlatego podczas przechowywania lub pobierania typu wartości zwykle występują pola boxing i rozpakowywanie. Klasa ConcurrentDictionary<TKey,TValue> powinna być używana, gdy wiele wątków może uzyskiwać dostęp do kolekcji jednocześnie.