У меня есть словарь с фиксированным количеством записей, и я хочу часто обновлять многие его значения, но только для уже существующих ключей. Если ключа еще нет в словаре, я не хочу его добавлять, поскольку моя цель — ограничить словарь фиксированным размером. Поэтому приведенный ниже код (с использованием индексатора set) не подойдет для моих нужд:
Этот код обновит значение ключа, если он уже существует, или вставит новую пару ключ/значение, если ее нет. Это не то, чего я хочу. Поэтому я написал метод расширения TryUpdate для класса Dictionary с желаемым поведением:
Код: Выделить всё
public static bool TryUpdate(
this Dictionary source,
TKey key, TValue value)
{
ArgumentNullException.ThrowIfNull(source);
if (!source.ContainsKey(key))
return false;
source[key] = value;
return true;
}
Теперь мой код работает как положено:
Что мне не нравится в приведенной выше реализации, так это то, что, если ключ уже существует, что является обычным случаем в моем сценарии, ключ будет хешироваться дважды в каждой операции TryUpdate. Поэтому, чтобы получить гарантию того, что мой словарь не превысит первоначальный размер, я собираюсь заплатить двойную цену с точки зрения производительности. Ключи представляют собой длинные строки, поэтому стоимость хеширования значительна. Есть ли способ переписать мой метод TryUpdate, чтобы он был таким же производительным, как индексатор set?