Щоб відповісти на питання, спершу нам слід поглянути на мету словника та основні технології.
Dictionary
є списком KeyValuePair<Tkey, Tvalue>
де кожне значення представлене його унікальним ключем. Скажімо, у нас є список улюблених продуктів. Кожне значення (назва їжі) представлено його унікальним ключем (позиція = скільки вам подобається ця їжа).
Приклад коду:
Dictionary<int, string> myDietFavorites = new Dictionary<int, string>()
{
{ 1, "Burger"},
{ 2, "Fries"},
{ 3, "Donuts"}
};
Скажімо, ви хочете залишатися здоровими, ви передумали і хочете замінити улюблений «Бургер» салатом. У вашому списку все ще є список ваших улюблених, ви не зміните характеру списку. Ваш улюблений залишиться номером один у списку, лише його значення зміниться. Це коли ви називаєте це:
/*your key stays 1, you only replace the value assigned to this key
you alter existing record in your dictionary*/
myDietFavorites[1] = "Salad";
Але не забувайте, що ви програміст, і відтепер ви закінчуєте свої пропозиції; Ви відмовляєтесь від використання емоджи, тому що вони б кинули помилку компіляції, і весь список обраних становить 0 індекс.
Ваша дієта теж змінилася! Отже, ви знову змінюєте свій список:
/*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");
Існує дві можливості з визначенням: ви або хочете дати нове визначення для чогось, що не існувало раніше, або ви хочете змінити визначення, яке вже існує.
Метод Додати дозволяє додавати запис, але лише за однієї умови: ключ для цього визначення може не існувати у вашому словнику.
Тепер ми будемо дивитись під капот. Коли ви створюєте словник, ваш компілятор зарезервує відро (пробіли в пам'яті для зберігання ваших записів). Відро не зберігає ключі так, як ви їх визначаєте. Кожен ключ хеширується перед тим, як перейти до відра (визначено Microsoft), варто згадати, що частина значення залишається незмінною.
Я буду використовувати алгоритм хешування CRC32 для спрощення мого прикладу. Коли ви визначаєте:
myDietFavorites[0] = "Pizza";
Що йде у відро, це db2dc565 "Піца" (спрощено).
Коли ви змінюєте значення на:
myDietFavorites[0] = "Spaghetti";
У вас є х 0, який знову-таки db2dc565 тоді ви шукаєте це значення у своєму відрі, щоб дізнатися, чи є він. Якщо він там, ви просто перепишіть значення, присвоєне ключу. Якщо його немає, ви помістіть свою вартість у відро.
Коли ви викликаєте функцію Додати у словнику, наприклад:
myDietFavorite.Add(0, "Chocolate");
У вас є х 0, щоб порівняти його з значенням у відрі. Ви можете помістити його у відро, лише якщо його немає .
Важливо знати, як це працює, особливо якщо ви працюєте зі словниками рядка чи знаку типу ключа. Це чутливе до регістру через перенесення хешування. Так, наприклад, "ім'я"! = "Ім'я". Давайте використаємо наш CRC32, щоб зобразити це.
Значення для "name" становить: e04112b1
Значення для "Name" дорівнює: 1107fb5b