Aby odpowiedzieć na to pytanie, najpierw musimy przyjrzeć się celowi słownika i związanej z nim technologii.
Dictionary
to lista miejsc, w KeyValuePair<Tkey, Tvalue>
których każda wartość jest reprezentowana przez swój unikalny klucz. Powiedzmy, że mamy listę Twoich ulubionych potraw. Każda wartość (nazwa potrawy) jest reprezentowana przez swój unikalny klucz (pozycja = jak bardzo lubisz to jedzenie).
Przykładowy kod:
Dictionary<int, string> myDietFavorites = new Dictionary<int, string>()
{
{ 1, "Burger"},
{ 2, "Fries"},
{ 3, "Donuts"}
};
Powiedzmy, że chcesz zachować zdrowie, zmieniłeś zdanie i chcesz zastąpić swojego ulubionego „burgera” sałatką. Twoja lista jest nadal listą ulubionych, nie zmienisz charakteru listy. Twój ulubiony pozostanie numerem jeden na liście, tylko jego wartość ulegnie zmianie. To wtedy nazywasz to:
/*your key stays 1, you only replace the value assigned to this key
you alter existing record in your dictionary*/
myDietFavorites[1] = "Salad";
Ale nie zapominaj, że jesteś programistą i od teraz kończysz swoje zdania; odmawiasz używania emoji, ponieważ zgłaszałyby one błąd kompilacji, a cała lista ulubionych jest oparta na indeksie 0.
Twoja dieta też się zmieniła! Więc ponownie zmieniasz listę:
/*you don't want to replace Salad, you want to add this new fancy 0
position to your list. It wasn't there before so you can either define it*/
myDietFavorites[0] = "Pizza";
/*or Add it*/
myDietFavorites.Add(0, "Pizza");
Istnieją dwie możliwości definiowania: albo chcesz podać nową definicję czegoś, co wcześniej nie istniało, albo chcesz zmienić definicję, która już istnieje.
Add umożliwia dodanie rekordu, ale tylko pod jednym warunkiem: klucz dla tej definicji może nie istnieć w Twoim słowniku.
Teraz zajrzymy pod maskę. Kiedy tworzysz słownik, twój kompilator dokonuje rezerwacji dla zasobnika (spacje w pamięci do przechowywania twoich rekordów). Zasobnik nie przechowuje kluczy w sposób, w jaki je definiujesz. Każdy klucz jest haszowany przed przejściem do zasobnika (zdefiniowanego przez Microsoft), warto wspomnieć, że część wartości pozostaje niezmieniona.
Użyję algorytmu mieszania CRC32, aby uprościć mój przykład. Podczas definiowania:
myDietFavorites[0] = "Pizza";
Do wiadra trafia db2dc565 „Pizza” (uproszczona).
Gdy zmienisz wartość w:
myDietFavorites[0] = "Spaghetti";
Haszujesz swoje 0, które ponownie jest db2dc565, a następnie sprawdzasz tę wartość w swoim zasobniku , aby sprawdzić, czy tam jest. Jeśli tam jest, po prostu przepisujesz wartość przypisaną do klucza. Jeśli go tam nie ma, umieścisz swoją wartość w wiadrze.
Podczas wywoływania funkcji Dodaj w słowniku, na przykład:
myDietFavorite.Add(0, "Chocolate");
Haszujesz swoje 0, aby porównać jego wartość z wartościami w zasobniku. Możesz umieścić go w wiadrze tylko wtedy, gdy go tam nie ma .
Ważne jest, aby wiedzieć, jak to działa, zwłaszcza jeśli pracujesz ze słownikami kluczy typu string lub char. W związku z haszowaniem rozróżniana jest wielkość liter. Na przykład „imię”! = „Imię”. Użyjmy naszego CRC32, aby to zobrazować.
Wartość dla „nazwy” to: e04112b1
Wartość dla „nazwy” to: 1107fb5b