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