Различные способы добавить к Словарю

В дополнение к выигрышам в производительности, CHAR может использоваться, чтобы указать, что все значения должны быть той же длиной, например, столбец для Американских Государственных сокращений.

94
задан Sune Rievers 4 December 2009 в 09:32
поделиться

5 ответов

Производительность почти на 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, генерируется исключение.

Итак для всех целей и намерений производительность одинакова.

Как и несколько других упоминаний, все дело в том, нужна ли вам проверка для попыток добавить один и тот же ключ дважды.

Извините за длинный пост, я надеюсь, что это хорошо.

99
ответ дан 24 November 2019 в 06:02
поделиться

Dictionary.Add (ключ, значение) и Dictionary [key] = value имеют разные цели:

  • Используйте Добавить к добавить новую пару ключ / значение, существующие ключи не будут заменены (выдается ArgumentException ).
  • Используйте индексатор, если вам все равно, уже ли ключ существует в словаре, другими словами: добавьте пару ключ / значение, если ключа нет в словаре, или замените значение для указанного ключа, если ключ уже есть в словаре.
29
ответ дан 24 November 2019 в 06:02
поделиться

Да, в этом разница, метод Add выдает исключение, если ключ уже существует.

Причина использования метода Add именно в этом. Если словарь уже не должен содержать ключ, обычно требуется исключение, чтобы вы знали о проблеме.

4
ответ дан 24 November 2019 в 06:02
поделиться

Учитывая наиболее вероятное сходство в производительности, используйте то, что кажется более правильным и читаемым для того фрагмента кода, который вы используете.

Я чувствую, что операция, описывающая добавление, является наличие ключа, которое уже является действительно редким исключением, лучше всего представлено с помощью add. Семантически это имеет больше смысла.

dict [key] = value лучше представляет собой замену. Если я увижу этот код, я почти ожидаю, что ключ уже есть в словаре.

0
ответ дан 24 November 2019 в 06:02
поделиться

Первая версия добавит новую KeyValuePair в словарь, выбрасывая, если ключ уже есть в словаре. Второй, используя индексатор, добавит новую пару, если ключ не существует, но перезапишет значение ключа, если оно уже существует в словаре.

IDictionary<string, string> strings = new Dictionary<string, string>();

strings["foo"] = "bar";          //strings["foo"] == "bar"
strings["foo"] = string.Empty;   //strings["foo"] == string.empty
strings.Add("foo", "bar");       //throws     
67
ответ дан 24 November 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: