Тип возврата словаря C # - PullRequest
5 голосов
/ 08 ноября 2011

У меня проблема с некоторым кодом C #, который я пишу, я довольно плохо знаком с C #, я осмотрелся и не могу найти решение.

У меня есть метод, который возвращает словарь, я установил тип возвращаемого значения для объекта, и это выглядит нормально.

    public object loopThroughNotificationCountQueries()
    {
        var countQuery = new Dictionary<string, string>(); ...


        ... return countQuery;
    }

Проблема в основном методе, где я 'Я пытаюсь перебрать элементы, возвращаемые из словаря.

                Notification notification = new Notification();

                var countDictionary = notification.loopThroughNotificationCountQueries();


                foreach(KeyValuePair<String, String> entry in countDictionary)
                {
                    ...
                }

Я получаю сообщение об ошибке: «Оператор foreach с ошибкой 2 не может работать с переменными типа« объект », потому что« объект »не содержитпубличное определение для 'GetEnumerator' "

Это потому, что я не указываю правильный тип возвращаемого значения для словаря?Или есть другой способ перебора записей в возвращаемом объекте?

Спасибо за помощь, Стивен.

Ответы [ 8 ]

10 голосов
/ 08 ноября 2011

Посмотрите на объявление вашего метода:

public object loopThroughNotificationCountQueries()

Это означает, что ваша countDictionary декларация эффективна:

object countDictionary = notification.loopThroughNotificationCountQueries();

... и вы не можете использовать foreach с таким object. Самое простое решение - изменить объявление метода, например, до

// Note case change as well to follow .NET naming conventions
public IDictionary<string, string> LoopThroughNotificationCountQueries()
8 голосов
/ 08 ноября 2011

Используйте

public Dictionary<string, string> loopThroughNotificationCountQueries() { ... }

или объясните, почему это невозможно.

4 голосов
/ 08 ноября 2011
public IDictionary<string, string> loopThroughNotificationCountQueries()
    {
        var countQuery = new Dictionary<string, string>(); ...


        ... return countQuery;
    }
2 голосов
/ 08 ноября 2011

Есть ли причина, по которой у вас не может быть подписи вашего метода, как показано ниже?Вы всегда возвращаете словарь с строковым ключом и строковым типом данных?

public Dictionary<string, string> loopThroughNotificationCountQueries() 
1 голос
/ 08 ноября 2011

да, предполагается, что это:

public IDictionary<string, string> loopThroughNotificationCountQueries()
{
}

Вы можете использовать его только через объекты IEnumerable<T>

, поэтому, если по какой-то причине вы не можете изменить loopThroughNotificationCountQueries, приведите объектIDictionary<string, string> сначала.

1 голос
/ 08 ноября 2011

ваш loopThroughNotificationCountQueries возвращает object.Заставьте его вернуть Dictionary<string, string>, изменив его подпись.

public Dictionary<string, string> loopThroughNotificationCountQueries()
{
    var countQuery = new Dictionary<string, string>(); ...


    ... return countQuery;
}
0 голосов
/ 08 ноября 2011

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

Множество способов обойти это, вероятность того, что вы захотите сделать SomeClass.SomeDictionary.Add ("name", "value"), невелика, вероятность того, что разумная реализация почти не существует.

В общем, у меня просто есть класс, у которого есть закрытый член типа словаря, и я раскрыл несколько методов. например,

public IEnumerable<String> Names { get { return _myDictionary.Keys;} }

и т.д.

Если я много этим занимаюсь, делегирую простой класс и несу с собой.

0 голосов
/ 08 ноября 2011

да, потому что вы не указываете тип возвращаемого значения.

две возможности:

лучше: вы указываете тип возвращаемого значения для словаря

хуже: вы приводите объект в словарь в вызывающем методе

...