Słownik kontra Hashtable
Słownik jest wpisany (rodzaje wartości nie muszą być zaznaczane), Hashtable nie jest wymagane (rodzaje wartości wymagają ustalenia). Hashtable ma lepszy sposób uzyskiwania wartości niż słownik IMHО, ponieważ zawsze wie, że wartość jest przedmiotem. Jeśli używasz .NET 3.5, łatwo jest napisać obszerną metodę dla słownika, aby uzyskać podobne zachowanie.
Klasa Hashtable jest specyficznym typem klasy słownikowej, która wykorzystuje wartość całkowitą (zwaną skrótem), aby pomóc w przechowywaniu kluczy. Klasa Hashtable używa skrótu, aby przyspieszyć wyszukiwanie określonego klucza w zbiorze. Każdy obiekt w .NET pochodzi z klasy Оbject. Ta klasa obsługuje metodę GetHash, która zwraca liczbę całkowitą jednoznacznie identyfikującą obiekt. Klasa Hashtable jest ogólnie bardzo wydajną kolekcją. Jedyny problem z klasą Hashtable polega na tym, że wymaga ona nieco przewagi, a w przypadku małych wyborów (mniej niż dziesięć elementów) ta głowica może utrudniać działanie.
Istnieje jedna znacząca różnica między tabelą skrótów a słownikiem. Jeśli użyjesz indeksatorów, aby uzyskać wartość HashTable, HashTable z powodzeniem zwróci wartość null dla nieistniejącego elementu, podczas gdy słownik zwróci błąd, jeśli spróbujesz uzyskać dostęp do elementu za pomocą indeksu, który nie istnieje w słowniku.
HashTable jest klasą podstawową, która jest słabo wpisana; Klasa abstrakcyjna DictionaryBase jest ściśle wpisywana i używa wewnętrznie tabeli HashTable.
Dziwną rzeczą zauważoną w Słowniku jest to, że kiedy dodajemy wiele wpisów w Słowniku, zostaje zachowana kolejność dodawania wpisów. Tak więc, jeśli zastosujesz zasięg w Słowniku, otrzymasz rekordy w tej samej kolejności, w której je wstawiłeś. Podczas gdy nie jest to prawdą w przypadku noRmal HashTable, kiedy dodajesz te same rekordy w Hashtable, zamówienie nie jest utrzymywane. Jeśli „Słownik jest oparty na Hashtable” jest prawdą, dlaczego Dictionary zachowuje komendę, ale HashTable nie?
Powodem, dla którego zachowują się inaczej, jest to, że słownik ogólny implementuje tablicę mieszającą, ale nie jest oparty na System.Cоllectiоns.Hashtable. Implementacja Słownika Ogólnego opiera się na alokacji par klucz-wartość z listy. Są one następnie indeksowane za pomocą segmentów mieszających z dostępem losowym, ale gdy zwraca numer, po prostu przesuwa listę w kolejności kolejnej - która będzie kolejnością wstawiania tak długo, jak wpisy nie będą ponownie używane..