OrderedDictionary 值不返回列表而是返回对象 [重复]
Posted
技术标签:
【中文标题】OrderedDictionary 值不返回列表而是返回对象 [重复]【英文标题】:OrderedDictionary value not returning list but object [duplicate] 【发布时间】:2021-09-18 19:38:38 【问题描述】:好吧,我放弃了。这可能是我想念的非常简单的事情,但在过去的 2 个小时里我一直被困在这个问题上,我在网上的任何地方都找不到答案。下面的代码在我的list
中的foreach
中显示了一个 CS1579 错误:
“foreach 语句无法对 'object' 类型的变量进行操作,因为 'object' 不包含 'GetEnumerator' 的公共定义”。
我的roomList[roomNameTest]
不应该返回List<string>
吗?
var roomList = new OrderedDictionary();
var listA = new List<string>();
listA.Add("elemA");
listA.Add("elemB");
roomList["roomA"] = listA;
var roomNameTest = "roomA";
if (roomList.Contains(roomNameTest))
var list = roomList[roomNameTest];
foreach (var item in list)
Console.WriteLine(item);
解决方案:
使用Dictionary<string, List<string>>()
效果非常好,我稍后根据需要使用OrderBy(x => x.Key)
对字典进行排序。感谢大家的贡献,非常感谢。
【问题讨论】:
OrderedDictionary
不是泛型类,因此它仅适用于 object
s。您将需要转换或使用不同类型的集合。您真的需要订购吗?
不,如果 roomList["roomA"]
是 object
。
var list = (List<string>)roomList[roomNameTest];
将修复它(在这种情况下)
如果您想使用字典,为什么必须订购您的收藏?
如果您先使用Dictionary<string, List<string>>
,然后使用roomList.ContainsKey
,则此代码可以正常工作。如果您真的需要坚持使用OrderedDictionary
,我会感到惊讶
【参考方案1】:
OrderedDictionary
不是泛型类,因此它仅适用于object
s。您将需要转换或使用不同类型的集合。例如:
var list = (List<string>) roomList[roomNameTest];
但是,如果您在字典中添加不是 <List<string>
的内容,这可能会导致问题。
另外,我不确定您是否需要在这里使用OrderedDictionary
,而强类型的Dictionary<string, List<string>>
会好得多。例如:
var roomList = new Dictionary<string, List<string>>();
//...
if (roomList.ContainsKey(roomNameTest))
//...
虽然我也建议使用TryGetValue
:
if(roomList.TryGetValue(roomNameTest, out var list))
foreach (var item in list)
Console.WriteLine(item);
【讨论】:
【参考方案2】:好吧,由于 OrderedDictionary
的项目声明为 object
类型,.Net 将它们视为
object
的实例,不实现 IEnumerable
。例如你可以很容易地把
roomList.Add("abc", 123);
roomList.Add("def", true);
roomList.Add("pqr", "bla-bla-bla");
您可以尝试投射这些项目
进入IEnumerable<string>
并成功循环:
var roomList = new System.Collections.Specialized.OrderedDictionary();
var listA = new List<string>();
listA.Add("elemA");
listA.Add("elemB");
// Note "Add", since item with Key == "roomA" doesn't exist
roomList.Add("roomA", listA);
var roomNameTest = "roomA";
if (roomList.Contains(roomNameTest))
// if item implements IEnumerable<string>, say it List<string>
// we can loop over it
if (roomList[roomNameTest] is IEnumerable<string> list)
foreach (var item in list)
Console.WriteLine(item);
【讨论】:
嗨,德米特里,我刚刚更好地查看了您的答案,我非常感谢您给我一种方法来检查 roomList[roomNameTest] 的输出是否为 IEnumerable 但错误已经告诉我输出不是,尽管给了我一种使用代码检测它的方法,但它并没有解决问题。以上是关于OrderedDictionary 值不返回列表而是返回对象 [重复]的主要内容,如果未能解决你的问题,请参考以下文章