Search code examples
c#pythondefaultdict

C# equivalent of Python's defaultdict (for lists) in C#


What is the C# equivalent of doing:

>>> from collections import defaultdict
>>> dct = defaultdict(list)
>>> dct['key1'].append('value1')
>>> dct['key1'].append('value2')
>>> dct
defaultdict(<type 'list'>, {'key1': ['value1', 'value2']})

For now, I have:

Dictionary<string, List<string>> dct = new Dictionary<string, List<string>>();
dct.Add("key1", "value1");
dct.Add("key1", "value2");

but that gives errors like "The best overloaded method match has invalid arguments".


Solution

  • Here's an extension method you can add to your project to emulate the behavior you want:

    public static class Extensions
    {
        public static void AddOrUpdate<TKey, TValue>(this Dictionary<TKey, List<TValue>> dictionary, TKey key, TValue value)
        {
            if (dictionary.ContainsKey(key))
            {
                dictionary[key].Add(value);
            }
            else
            {
                dictionary.Add(key, new List<TValue>{value});
            }
        }
    }
    

    Usage:

    Dictionary<string, List<string>> dct = new Dictionary<string, List<string>>();
    dct.AddOrUpdate("key1", "value1");
    dct.AddOrUpdate("key1", "value2");