К сожалению, в реализации bcl такого нет. Ближайшая альтернатива - два поиска, но у одного может быть общий метод расширения, чтобы упростить его, как показано здесь
public static T GetOrAdd<S, T>(this IDictionary<S, T> dict, S key,
Func<T> valueCreator)
{
T value;
return dict.TryGetValue(key, out value) ? value : dict[key] = valueCreator();
}
Но есть реализация C5 , которая делает это «из коробки». Определение метода выглядит следующим образом:
public virtual bool FindOrAdd(K key, ref V value)
{
}
Я не знаю, почему они не принимают Func<V>
вместо V
для отсрочки создания объекта. С5 имеет много хороших подобных трюков, например,
public virtual bool Remove(K key, out V value)
public virtual bool Update(K key, V value, out V oldvalue)
public virtual bool UpdateOrAdd(K key, V value, out V oldvalue)