Как обновить значение ключа в словаре, но только если ключ уже существует, не хешируя его дважды?C#

Место общения программистов C#
Ответить
Anonymous
 Как обновить значение ключа в словаре, но только если ключ уже существует, не хешируя его дважды?

Сообщение Anonymous »

У меня есть словарь с фиксированным количеством записей, и я хочу часто обновлять многие его значения, но только для уже существующих ключей. Если ключа еще нет в словаре, я не хочу его добавлять, поскольку моя цель — ограничить словарь фиксированным размером. Поэтому приведенный ниже код (с использованием индексатора set) не подойдет для моих нужд:

Код: Выделить всё

dictionary[key] = newValue;
Этот код обновит значение ключа, если он уже существует, или вставит новую пару ключ/значение, если ее нет. Это не то, чего я хочу. Поэтому я написал метод расширения 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;
}
Теперь мой код работает как положено:

Код: Выделить всё

dictionary.TryUpdate(key, newValue);
Что мне не нравится в приведенной выше реализации, так это то, что, если ключ уже существует, что является обычным случаем в моем сценарии, ключ будет хешироваться дважды в каждой операции TryUpdate. Поэтому, чтобы получить гарантию того, что мой словарь не превысит первоначальный размер, я собираюсь заплатить двойную цену с точки зрения производительности. Ключи представляют собой длинные строки, поэтому стоимость хеширования значительна. Есть ли способ переписать мой метод TryUpdate, чтобы он был таким же производительным, как индексатор set?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»