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'的公共定义"
是因为我没有为字典指定正确的返回类型吗?或者是否有另一种方法遍历返回对象中的条目?
谢谢你的帮助,斯蒂芬。
看看你的方法声明:
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()
使用
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;} }
等。
如果我做了很多,委托给一个简单的类,并携带它。