Dictionary<TKey, TValue>
Słownik to typ kolekcji, który jest przydatny, gdy potrzebujesz szybkiego wyszukiwania według kluczy. Na przykład wyobraź sobie, że masz listę klientów i w ramach zadania musisz szybko wyszukać klienta według jego identyfikatora (lub innego unikalnego identyfikatora, który nazywamy kluczem).
W przypadku listy wyszukiwanie klienta obejmuje wyszukiwanie liniowe, a koszt tej operacji, może być duży. Jednak w przypadku słownika wyszukiwanie jest bardzo szybkie, co oznacza, że bez względu na to, jak duży jest słownik, czas wyszukiwania pozostaje stosunkowo mały i stały.
Podczas przechowywania lub wyszukiwania obiektu w słowniku musisz podać klucz. Klucz jest wartością, która jednoznacznie identyfikuje obiekt i nie może mieć wartości NULL. Na przykład, aby przechowywać klienta w słowniku, możesz użyć CustomerID jako klucza.
Aby utworzyć słownik, najpierw musisz określić typ kluczy i wartości:
var dictionary = new Dictionary<int, Customer>();
Możesz także dodawać obiekty do słownika podczas inicjalizacji:
var dictionary = new Dictionary<int, Customer>
{
{ customer1.Id, customer1 },
{ customer2.Id, customer2 }
}
Później możesz bardzo szybko wyszukać klientów według ich identyfikatorów:
Zwróć klienta o identyfikatorze 34
varcustomer = dictionary[34];
Możesz usunąć obiekt za pomocą jego klucza lub usunąć wszystkie obiekty za pomocą metody Clear:
// Usuwanie obiektu według jego klucza
dictionary.Remove(1);
// Usuwanie wszystkich obiektów
dictionary.Clear()
A oto kilka innych przydatnych metod dostępnych w klasie Dictionary:
var count = dictionary.Count;
var containsKey = dictionary.ContainsKey(5);
var containsValue = dictionary.ContainsValue(customer);
// Iteruje po kluczach
foreach (var key in dictionary.Keys)
Console.WriteLine(dictionary[key]);
// Iteruje po wartościach
foreach (var value in dictionary.Values)
Console.WriteLine(value);
// Iteruje po słowniku
foreach (var keyValuePair in dictionary)
{
Console.WriteLine(keyValuePair.Key);
Console.WriteLine(keyValuePair.Value);
}
Dlaczego więc wyszukiwanie słownika jest tak szybkie?
Słownik wewnętrznie przechowuje obiekty w tablicy, ale w przeciwieństwie do listy, w której obiekty są dodawane na końcu tablicy (lub pod podanym indeksem), w słowniku indeks jest obliczany za pomocą funkcji hash.
Kiedy więc przechowujemy obiekt w słowniku, wywoła on metodę GetHashCode na kluczu obiektu, aby obliczyć hash. Hash jest następnie dostosowywany do rozmiaru tablicy w celu obliczenia indeksu w tablicy do przechowywania obiektu.
Później, kiedy szukamy obiektu po jego kluczu, metoda GetHashCode jest ponownie używana do obliczania wartości hash i indeksu. Jak się dowiedziałeś wcześniej, wyszukiwanie obiektu według indeksu w tablicy jest szybką operacją.
W przeciwieństwie do list, wyszukiwanie obiektu w słowniku nie wymaga skanowania każdego obiektu i bez względu na to, jak duży jest słownik, pozostanie on niezwykle szybki.
Jako programista C# musisz wiedzieć, że słowniki są kolekcjami opartymi na haszowaniu i dlatego wyszukiwania są bardzo szybkie.