Метод ConcurrentDictionary<T,K>.GetOrAdd
чрезвычайно полезен.
private ConcurrentDictionary<string, ICollection<int>> _dictionary;
private static ICollection<int> CreateEmptyList(string dummyKey)
{
return new List<int>();
}
private void AddValue(string key, int value)
{
ICollection<int> values = _dictionary.GetOrAdd(key, CreateEmptyList);
values.Add(value);
}
Редактировать: Вот пример того, как реализовать функцию в качестве метода расширения для IDictionary<T,K>
(C # 3):
Обратите внимание, что IDictionary<TKey, TValue>
, как правило, не является потокобезопасным, поэтому, если вы хотите обеспечить безопасность потоков с помощью этого метода расширения, вам придется реализовать его вручную, как и для других операций.
public static TValue GetOrAdd<TKey, TValue>(
this IDictionary<TKey, TValue> dictionary,
TKey key,
Func<TKey, TValue> valueFactory)
{
TValue value;
if (!dictionary.TryGetValue(key, out value))
{
value = valueFactory(key);
dictionary.Add(key, value);
}
return value;
}