Подтвердить что ты не робот

System.Collections.Generic.Dictionary `Add` vs set` Item`

Если я хочу поместить элементы в System.Collections.Generic.Dictionary, я могу либо Add, либо установить Item.

Я знаю, что если мы делаем Add, он проверяет, существует ли ключ, и если он не генерирует исключение.

Итак, если вы добавляете тонну элементов, предпочитаю ли я устанавливать Item вместо Add, так как Add выполняет ненужные проверки, которые могут фактически замедлить работу?

4b9b3361

Ответ 1

Вот что происходит, когда вы устанавливаете Item:

public void set_Item(TKey key, TValue value)
{
    this.Insert(key, value, false);
}

Вот что происходит, когда вы добавляете элемент:

public void Add(TKey key, TValue value)
{
    this.Insert(key, value, true);
}

Последний параметр последнего параметра bool add последнего параметра влияет только на эту строку:

if (add)
{
    ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);
}

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

Ответ 2

Все зависит от того, хотите ли вы обрабатывать повторяющиеся ключи или перезаписывать любой потенциально существующий элемент. Чтобы проверить наличие дубликатов, вы можете использовать:

  • Метод ContainsKey, чтобы проверить, существует ли ключ.
  • метод TryGetValue, чтобы проверить, существует ли ключ и получить значение, если оно доступно.

Например:

var dict = new Dictionary<int, string>();

Console.WriteLine(dict.ContainsKey(1)); // false
dict[1] = "hi";
dict[1] = "hello"; // "hi" is overwritten

// true: hello
Console.WriteLine("{0}: {1}", dict.ContainsKey(1), dict[1]);

// TryGetValue if checking by key and interested in the value
string result;
if (dict.TryGetValue(1, out result))
{
    Console.WriteLine("Key 1 exists: " + result);
}
else
{
    Console.WriteLine("Key 1 not found");
}

Ответ 3

Бросание исключений дешево, их обработка их стоит дорого. Часть try блока try/catch работает как обычно. Когда блок catch выполняется, он должен разматывать стек, чтобы заполнить трассировку стека (между прочим). Это то, что делает исключения дорогостоящими. Это является причиной того, что вы избегаете ловить исключения, если у вас есть средства для этого, используя такие методы, как Dictionary<T>.ContainsKey

Очень маловероятно, что вы заметите разницу в производительности между вызовом "Добавить" и "Установка элемента". Поэтому используйте тот, который наиболее подходит для ситуации.

Обновление: Не оптимизируйте свой код, если он не медленный.