Чтобы сначала ответить на вопрос, нам нужно взглянуть на назначение словаря и лежащих в его основе технологий.
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");
Существует две возможности определения: вы либо хотите дать новое определение для чего-то, чего раньше не было, либо хотите изменить определение, которое уже существует.
Метод Add позволяет добавить запись, но только при одном условии: ключ для этого определения может отсутствовать в вашем словаре.
Теперь мы собираемся заглянуть под капот. Когда вы создаете словарь, ваш компилятор резервирует корзину (места в памяти для хранения ваших записей). Bucket не хранит ключи так, как вы их определяете. Каждый ключ хэшируется перед отправкой в корзину (определено Microsoft), стоит отметить, что часть значения остается неизменной.
Я буду использовать алгоритм хэширования CRC32, чтобы упростить мой пример. Когда вы определяете:
myDietFavorites[0] = "Pizza";
То, что идет в ведро, это db2dc565"Пицца" (упрощенно).
Когда вы изменяете значение с помощью:
myDietFavorites[0] = "Spaghetti";
Вы хешируете свой 0, который снова равен db2dc565 , затем вы ищите это значение в своем корзине, чтобы найти, есть ли оно там. Если это так, вы просто переписываете значение, назначенное клавише. Если его там нет, вы поместите свою ценность в корзину.
При вызове функции Add в вашем словаре, например:
myDietFavorite.Add(0, "Chocolate");
Вы хешируете свой 0, чтобы сравнить его значение с теми, что в корзине. Вы можете поместить его в ведро , только если его там нет .
Очень важно знать, как это работает, особенно если вы работаете со словарями типа string или char. Это чувствительно к регистру из-за хеширования. Так, например, «имя»! = «Имя». Давайте использовать наш CRC32, чтобы изобразить это.
Значение для "name": e04112b1
Значение для «Имя»: 1107fb5b