Производительность почти на 100% идентична. Вы можете убедиться в этом, открыв класс в Reflector.net.
Это индексатор This:
public TValue this[TKey key]
{
get
{
int index = this.FindEntry(key);
if (index >= 0)
{
return this.entries[index].value;
}
ThrowHelper.ThrowKeyNotFoundException();
return default(TValue);
}
set
{
this.Insert(key, value, false);
}
}
А это метод Add:
public void Add(TKey key, TValue value)
{
this.Insert(key, value, true);
}
Я не буду публиковать весь метод Insert, поскольку он довольно длинный, однако объявление метода таково:
private void Insert(TKey key, TValue value, bool add)
Далее в функции происходит следующее:
if ((this.entries[i].hashCode == num) && this.comparer.Equals(this.entries[i].key, key))
{
if (add)
{
ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);
}
Что проверяет, существует ли уже ключ, и если это так и параметр add имеет значение true, он выдает исключение.
Так что для всех целей и намерений производительность одинакова.
Как и в нескольких других упоминаниях, все дело в том, нужна ли вам проверка для попыток дважды добавить один и тот же ключ.
Извините за длинный пост, надеюсь, все в порядке.
Первая версия добавит в словарь новый KeyValuePair, выбрасывая, если ключ уже есть в словаре. Второй, используя индексатор, добавит новую пару, если ключ не существует, но перезапишет значение ключа, если оно уже существует в словаре.
источник
Dictionary.Add(key, value)
иDictionary[key] = value
имеют разные цели:Add
метод для добавления новой пары ключ / значение, существующие ключи не будут заменены (выдаетсяArgumentException
символ).источник
Чтобы сначала ответить на вопрос, нам нужно взглянуть на назначение словаря и лежащих в основе технологий.
Dictionary
это список, вKeyValuePair<Tkey, Tvalue>
котором каждое значение представлено своим уникальным ключом. Допустим, у нас есть список ваших любимых блюд. Каждое значение (название блюда) представлено своим уникальным ключом (позиция = насколько вам нравится эта еда).Пример кода:
Допустим, вы хотите оставаться здоровым, вы передумали и хотите заменить любимый «бургер» салатом. Ваш список по-прежнему остается списком избранных, вы не меняете характер списка. Ваш фаворит останется номером один в списке, изменится только его ценность. Это когда вы называете это:
Но не забывайте, что вы программист, и с этого момента вы заканчиваете свои предложения словами: вы отказываетесь использовать смайлики, потому что они вызовут ошибку компиляции, а весь список избранного имеет индекс 0.
Ваша диета тоже изменилась! Итак, вы снова меняете свой список:
Есть две возможности с определением: вы либо хотите дать новое определение для чего-то, чего раньше не существовало, либо вы хотите изменить определение, которое уже существует.
Метод Add позволяет вам добавить запись, но только при одном условии: ключ для этого определения может не существовать в вашем словаре.
Теперь заглянем под капот. Когда вы создаете словарь, ваш компилятор резервирует ведро (места в памяти для хранения ваших записей). Bucket не хранит ключи так, как вы их определяете. Каждый ключ хешируется перед переходом в корзину (определенную Microsoft), стоит отметить, что часть значения остается неизменной.
Я буду использовать алгоритм хеширования CRC32, чтобы упростить свой пример. Когда вы определяете:
В ведро идет db2dc565 "Пицца" (упрощенно).
Когда вы меняете значение с помощью:
Вы хешируете свой 0, который снова является db2dc565, затем вы просматриваете это значение в своем сегменте, чтобы узнать, есть ли оно там. Если это так, вы просто перезаписываете значение, присвоенное ключу. Если его там нет, вы поместите свою ценность в корзину.
Когда вы вызываете функцию добавления в своем словаре, например:
Вы хешируете свой 0, чтобы сравнить его значение с единицами в корзине. Вы можете положить его в ведро, только если его там нет .
Очень важно знать, как это работает, особенно если вы работаете со словарями с ключом строкового или символьного типа. Это чувствительно к регистру из-за хеширования. Так, например, «name»! = «Name». Давайте воспользуемся CRC32, чтобы изобразить это.
Значение для «name»: e04112b1 Значение для «Name»: 1107fb5b
источник
Да, в этом разница, метод Add выдает исключение, если ключ уже существует.
Причина использования метода Add именно в этом. Если словарь уже не должен содержать ключ, обычно требуется исключение, чтобы вы знали о проблеме.
источник
Учитывая наиболее вероятное сходство в производительности, используйте то, что кажется более правильным и читаемым для используемого фрагмента кода.
Я чувствую, что операция, описывающая добавление, поскольку наличие ключа уже является действительно редким исключением, лучше всего представлено с помощью добавления. Семантически это имеет больше смысла.
dict[key] = value
Представляет лучшую замену. Если я увижу этот код, я почти ожидаю, что ключ уже есть в словаре.источник
dic[key] = value
что ключ уже присутствует, но я предполагаю , что спорно;)Один присваивает значение, а другой добавляет в словарь новый ключ и значение.
источник
Чтобы вставить значение в словарь
источник