如何解决OrderedDictionary 值不返回列表而是返回对象
好吧,我放弃了。这可能是我遗漏的非常简单的事情,但在过去的 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
。您将需要强制转换或使用不同类型的集合。例如:
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);
}
}
,
好吧,由于 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);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。