Praca z Hashtable i Dictionary w C #

Microsoft .Net Framework zapewnia doskonałe wsparcie dla pracy z kolekcjami. Kolekcje służą do przechowywania i wyszukiwania danych. Używasz kolekcji w aplikacji do dynamicznego przydzielania pamięci w celu przechowywania elementów, a następnie pobierania ich za pomocą klucza lub indeksu w razie potrzeby. Zasadniczo kolekcja reprezentuje zestaw obiektów, do których można uzyskać dostęp, wykonując iterację każdego z elementów kolekcji.

Hashtable

Typy w przestrzeni nazw System.Collections przechowują dane jako obiekty typu Object. Hashtable reprezentuje strukturę danych, która może przechowywać obiekty jako pary klucz-wartość. Możesz wyszukać wartość w instancji klasy Hashtable za pomocą odpowiedniego klucza. Należy zauważyć, że zarówno klucz, jak i wartość przechowywana w instancji Hashtable są typu obiektowego. Zauważ, że klucz nie może być pusty. Mimo to możesz mieć zapisaną wartość null. Poniższy wykaz kodu ilustruje sposób przechowywania i pobierania kluczy / wartości z instancji Hashtable.

static void Main()

       {

           Hashtable hashTable = new Hashtable();

           hashTable.Add(1, "Joydip");

           hashTable.Add(2, "James");

           hashTable.Add(3, "Steve");

           Console.WriteLine("The key / value pairs are:--");

           foreach (int key in hashTable.Keys)

           {

               Console.WriteLine("Key: "+ key + " Value: "+ hashTable[key].ToString());

           }

           Console.Read();

       }

Można również skorzystać z metody GetEnumerator () klasy Hashtable, a następnie wyliczyć kolekcję, aby pobrać przechowywane w niej pary klucz / wartość. Oto fragment kodu, który to ilustruje.

IDictionaryEnumerator enumerator = hashTable.GetEnumerator();

while (enumerator.MoveNext())

{

Console.WriteLine("Key: " + enumerator.Key.ToString() + " Value: " + enumerator.Value.ToString());

}

Możesz również skorzystać z klasy DictionaryEntry, aby wykonać iterację elementów w tablicy z haszowaniem. Poniższy fragment kodu ilustruje, jak można to zrobić.

Hashtable hashTable = new Hashtable();

hashTable.Add(1, "Joydip");

hashTable.Add(2, "James");

hashTable.Add(3, "Steve");

foreach (DictionaryEntry dictionaryEntry in hashTable)

{

   Console.WriteLine("Key: " + dictionaryEntry.Key.ToString() + " Value: " + dictionaryEntry.Value.ToString());

}

Przeszukiwanie pozycji w tablicy z haszowaniem jest szybsze w porównaniu z innymi kolekcjami nieogólnymi - zrozummy, dlaczego. Rekord w tablicy z haszowaniem w zasobnikach (każdy zasobnik może zawierać wiele rekordów) przy użyciu kluczy mieszających. Klucz skrótu jest z kolei generowany automatycznie przy użyciu algorytmu haszującego. MSDN stwierdza: „Kiedy element jest dodawany do tablicy z haszowaniem, element jest umieszczany w zasobniku na podstawie kodu skrótu klucza. Kolejne wyszukiwania klucza używają kodu skrótu klucza do wyszukiwania tylko w jednym określonym zasobniku, w ten sposób znacznie zmniejszając liczbę kluczowych porównań wymaganych do znalezienia elementu ”.

Słownik

Niektóre z ważnych klas w przestrzeni nazw System.Collections.Generic obejmują: List, Queue, HashSet, LinkedList, Stack, LinkedListNode i Dictionary. Klasa Dictionary w języku C # reprezentuje ogólną strukturę danych, która może zawierać klucze i wartości danych. Dlatego w instancji Dictionary można przechowywać dane dowolnego typu.

Należy pamiętać, że chociaż interfejs ICollection rozszerza interfejs IEnumerable, zarówno interfejsy IDictionary, jak i IList rozszerzają interfejs ICollection. Klasa Dictionary znajduje się w przestrzeni nazw System.Collections.Generic. W istocie słownik zawiera ogólny zbiór par klucz / wartość. Możesz skorzystać z metody Add klasy Dictionary, aby przechowywać obiekty w instancji Dictionary. Słownik jest szybszy niż tablica z haszowaniem, ponieważ eliminuje narzuty związane z boksowaniem i rozpakowywaniem.

Poniższy fragment kodu pokazuje, jak można przechowywać i pobierać obiekty w wystąpieniu Dictionary.

Dictionary dictionary = new Dictionary();

dictionary.Add(1, "Joydip");

dictionary.Add(2, "James");

dictionary.Add(3, "Steve");

foreach (KeyValuePair kvp in dictionary)

{

Console.WriteLine(kvp.Key.ToString() + " - " + kvp.Value.ToString());

}

Podstawowa różnica między Hashtable i Dictionary polega na tym, że podczas gdy pierwszy z nich nie jest wpisany i wymaga narzutu związanego z boksowaniem i rozpakowywaniem, drugi nie jest taki, jak jest wpisany. Jest między nimi inna różnica. Jeśli używasz indeksatora do pobierania wartości z wystąpienia Hashtable, a element nie istnieje, zostanie zwrócona wartość null. Wręcz przeciwnie, jeśli spróbujesz pobrać nieistniejący element z instancji Dictionary, zostanie zgłoszony wyjątek. Zauważ, że ani Hashtable, ani Dictionary nie gwarantują zachowania kolejności elementów w kolekcji.

Podczas gdy Hashtable jest strukturą danych o słabym typie, Dictionary jest strukturą o silnym typie. Wybór między tabelą z haszowaniem a słownikiem zależy od tego, czy potrzebujesz kolekcji bezpiecznej dla typów. W większości przypadków słownik to dobry wybór. Mówiąc prościej, słownik to ulepszona tablica z haszowaniem. Często używam Dictionary zamiast Hashtable.