2013-08-02 5 views
0

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

myDictionary.SetOrIncrement(name, 1); 

Однако есть VisualStudio grumbls

«Словарь не содержит определение для „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; 
    } 
} 
+0

Вы включили пространство имен для вашего метода расширения, в коде, в котором вы пытаетесь использовать метод extentionmethod? –

+0

Нет, но класс, использующий метод расширения, находится в том же пространстве имен. 'namespace test {class user {...} public static class ExtensionMethods {...}}' – Explicat

+0

Из интереса, если ключ словаря уже существует, вы действительно имеете в виду, что он игнорирует значение set и все еще увеличивает значение на один из них означает, что вы делаете '+ = set'? Кажется странным игнорировать параметр в некоторых ситуациях ... – Chris

ответ

1

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

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

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 всегда один и тот же, а не общий параметр.

1

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

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; 
    } 
} 
+0

Спасибо, вот и все! – Explicat

Смежные вопросы