Словарь для агрегации

Для агрегирования числа вхождений некоторых определенных значений я использую dictionary<valueName:string, counter:int>Я не знаю значения точно. Итак, я написал метод SetOrIncrementкоторый предположительно используется как

myDictionary.SetOrIncrement(name, 1);

Тем не менее, есть VisualStudio ворчит

"Словарь не содержит определения для" SetOrIncrement "и метод расширения" SetOrIncrement ", принимающий первый аргумент типа" Словарь ", не найден".

Кто-нибудь может сказать мне, в чем причина?

Вот SetAndIncrement метод:

public static class ExtensionMethods
{
    public static int SetOrIncrement<TKey, int>(this Dictionary<TKey, int> dict, TKey key, int set) {
        int value;
        if (!dict.TryGetValue(key, out value)) {
           dict.Add(key, set);
           return set;
        }
        dict[key] = ++value;
        return value;
    }
}

2 ответа

Решение

Ваш метод расширения компилируется правильно? Когда я пытаюсь скомпилировать его, я получаю: "Объявление параметра типа должно быть идентификатором, а не типом".

Причина в том, что в этой строке:

public static int SetOrIncrement<TKey, int>(this Dictionary<TKey, int> dict, TKey key, int set) {

int в общих параметрах для метода недопустимо. Вместо этого это должно работать:

public static int SetOrIncrement<TKey>(this Dictionary<TKey, int> dict, TKey key, int set) {

Причина в том, что TKey это единственный тип, который меняется. Int всегда одинаково, поэтому не является универсальным параметром.

Попробуй это:

void Main()
{
    var dict = new Dictionary<string, int>();
    dict.SetOrIncrement("qwe", 1);
}

// Define other methods and classes here
public static class ExtensionMethods
{
    public static int SetOrIncrement<TKey>(this Dictionary<TKey, int> dict, TKey key, int set)
    {
        int value;
        if (!dict.TryGetValue(key, out value)) {
           dict.Add(key, set);
           return set;
        }
        dict[key] = ++value;
        return value;
    }
}
Другие вопросы по тегам