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);
      }
  }