С# эквивалент Python defaultdict (для списков) в С#

Что эквивалентно С#:

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

На данный момент у меня есть:

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

но это дает такие ошибки, как «Лучшее совпадение перегруженного метода имеет недопустимые аргументы».


person BioGeek    schedule 28.01.2014    source источник
comment
причина, по которой возникает ошибка, заключается в том, что вы не передаете List<string> для значения словаря.   -  person George Stocker    schedule 28.01.2014
comment
Вы добавляете string в качестве значения, когда оно должно быть List<string>   -  person DGibbs    schedule 28.01.2014


Ответы (3)


Вот метод расширения, который вы можете добавить в свой проект, чтобы эмулировать поведение, которое вы хотите:

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});
        }
    }
}

Использование:

Dictionary<string, List<string>> dct = new Dictionary<string, List<string>>();
dct.AddOrUpdate("key1", "value1");
dct.AddOrUpdate("key1", "value2");
person Sven Grosen    schedule 28.01.2014

Вашим первым шагом должно быть создание записи с указанным ключом. Затем вы можете добавить дополнительные значения в список значений:

Dictionary<string, List<string>> dct = new Dictionary<string, List<string>>();
dct.Add("key1", new List<string>{"value1"});
dct["key1"].Add("value2");
person Andrei    schedule 28.01.2014
comment
Есть ли способ получить значения по умолчанию, которые предоставляет версия Python? Кажется, для этого требуется другой код в зависимости от того, присутствует ли уже ключ. - person user2357112 supports Monica; 28.01.2014
comment
@user2357112, из коробки - нет. Вы всегда можете реализовать расширение для этого, хотя - person Andrei; 28.01.2014

person    schedule
comment
Есть ли способ получить значения по умолчанию, которые предоставляет версия Python? Кажется, для этого требуется другой код в зависимости от того, присутствует ли уже ключ. - person user2357112 supports Monica; 28.01.2014
comment
Нет, для этого нужно написать код. - person Sameer; 28.01.2014