Возвращаемый тип словаря C #

#c# #types #dictionary #return

#c# #типы #словарь #Возврат

Вопрос:

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

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

     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)
                {
                    ...
                }
  

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

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

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

Ответ №1:

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

 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()
  

Комментарии:

1. Спасибо за вашу помощь, как я уже сказал, я новичок в C # и я не знал, что методы могут быть объявлены как словарь.

Ответ №2:

Использовать

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

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

Комментарии:

1. @Vlad — Какой модификатор доступа? Вы имеете в виду возвращаемый тип?

2. @Oded Модификаторы доступа

3. @Vlad — Я знаю, что такое модификаторы доступа. Я просто не понимаю, почему вы думаете, что они имеют отношение к ответу.

4. общедоступный идентификатор был бы лучше. (вместо словаря)

5. @Oded, По общему признанию, с моей стороны это не очень stackoverflowy, но я нашел опечатку Хенка забавной. Ответ тоже верен, поэтому я придерживаюсь своего 1.

Ответ №3:

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


        ... return countQuery;
    }
  

Ответ №4:

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

 public Dictionary<string, string> loopThroughNotificationCountQueries() 
  

Ответ №5:

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

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


    ... return countQuery;
}
  

Ответ №6:

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

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

Вы можете взаимодействовать только с объектами IEnumerable<T>

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

Ответ №7:

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

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

тем лучше: вы указываете возвращаемый тип в Dictionary

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

Комментарии:

1. Он действительно указывает возвращаемый тип — object .

2. ha ha. как я пишу в аннотации к книге: «это книга», да, это правильно

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

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

Ответ №8:

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

Есть много способов обойти это, вероятность того, что вы захотите сделать какой-то класс.someDictionary.Add(«имя», «значение») невелики, вероятность того, что это разумная реализация, практически отсутствует.

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

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

и т.д.

Если я делаю это часто, делегирую простому классу и продолжаю это делать.