Как говорит Евгений, индексатор уже заменит существующие значения - поэтому, если вы просто хотите безоговорочно установить значение для данного ключа, вы можете сделать
dictionary[key] = value;
Более интересный случай - «получить значение или вставить его при необходимости». Это легко сделать с помощью метода расширения:
public static TValue GetOrCreateValue<TKey, TValue>
(this IDictionary<TKey, TValue> dictionary,
TKey key,
TValue value)
{
return dictionary.GetOrCreateValue(key, () => value);
}
public static TValue GetOrCreateValue<TKey, TValue>
(this IDictionary<TKey, TValue> dictionary,
TKey key,
Func<TValue> valueProvider)
{
TValue ret;
if (!dictionary.TryGetValue(key, out ret))
{
ret = valueProvider();
dictionary[key] = ret;
}
return ret;
}
Обратите внимание на использование делегата для создания значения по умолчанию, что облегчает такие сценарии, как «список как значение»; Вы не хотите создавать пустой список, если вам не нужно:
dict.GetOrCreateValue(key, () => new List<int>()).Add(item);
Также обратите внимание, что поиск выполняется только один раз, если ключ уже присутствует - нет необходимости делать ContainsKey
и , тогда ищет значение. Тем не менее, для создания нового значения все еще требуется два поиска.