Jon Skeet recently posted
his DictionaryUtility.GetOrCreate
method.
Here’s our version (sans-parameter validation):
public static TValue GetOrAddValue<TKey, TValue>(
this IDictionary<TKey, TValue> dict, TKey key)
where TValue : new()
{
TValue value;
if (dict.TryGetValue(key, out value))
return value;
value = new TValue();
dict.Add(key, value);
return value;
}
public static TValue GetOrAddValue<TKey, TValue>(
this IDictionary<TKey, TValue> dict, TKey key,
Func<TValue> generator)
{
TValue value;
if (dict.TryGetValue(key, out value))
return value;
value = generator();
dict.Add(key, value);
return value;
}
First note that we have an overload that takes a Func<TValue>
. This enables
us to call GetOrAddValue
even for types that don’t support a parameterless
constructor. We pass a Func<TValue>
rather than a TValue
to avoid
needlessly creating empty instances when they already exist in the dictionary.
Also, since we’re using the looked-up value if it exists, we call
TryGetValue
instead of checking ContainsKey
.
Posted by Jacob Carpenter on February 05, 2008