Словарь для агрегации
Для агрегирования числа вхождений некоторых определенных значений я использую 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;
}
}