c#字典返回类型

本文关键字:返回类型 字典 | 更新日期: 2023-09-27 18:14:02

我在写一些c#代码时遇到了一个问题,我是c#的新手,我已经环顾四周,找不到解决方案。

我有一个返回Dictionary的方法,我将返回类型设置为object,看起来没问题。

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

        ... return countQuery;
    }

问题是在main方法中,我试图循环遍历从字典返回的元素。

                Notification notification = new Notification();
                var countDictionary = notification.loopThroughNotificationCountQueries();

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

我得到一个错误说"错误2 foreach语句不能操作类型为'object'的变量,因为'object'不包含'GetEnumerator'的公共定义"

是因为我没有为字典指定正确的返回类型吗?或者是否有另一种方法遍历返回对象中的条目?

谢谢你的帮助,斯蒂芬。

c#字典返回类型

看看你的方法声明:

public object loopThroughNotificationCountQueries()

这意味着你的countDictionary声明是有效的:

object countDictionary = notification.loopThroughNotificationCountQueries();

…你不能像这样用foreachobject。最简单的修复方法是更改方法声明,例如改为

// Note case change as well to follow .NET naming conventions
public IDictionary<string, string> LoopThroughNotificationCountQueries()

使用

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

或者解释为什么这是不可能的。

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

        ... return countQuery;
    }

有什么原因不能让你的方法签名如下?你是否总是返回一个带有字符串键类型和字符串数据类型的字典?

public Dictionary<string, string> loopThroughNotificationCountQueries() 

您的loopThroughNotificationCountQueries返回object。通过改变它的签名使它返回Dictionary<string, string>

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

    ... return countQuery;
}

是的,它应该是:

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

只能遍历IEnumerable<T>

的对象

因此,如果由于某种原因不能更改loopThroughNotificationCountQueries,请先将对象强制转换为IDictionary<string, string>

是,这是因为你没有指定返回类型。

两种可能性:

更好:指定Dictionary的返回类型

更糟:在调用方法

中将对象强制转换为字典

你不应该在非私有方法中返回字典,它暴露了类型,以及它所有的方法和属性,如果你不需要它们,大多数情况下你不应该这样做。打开FxCop,它会对你怒吼

有很多方法可以绕过它,您想要执行someecclass . somedictionary . add ("name","value")的机会很小,这是一个明智的实现的机会几乎不存在。

一般来说,我只是让我的类有一个Dictionary类型的私有成员并公开一些方法例如

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

等。

如果我做了很多,委托给一个简单的类,并携带它。