OrderedDictionary 值不返回列表而是返回对象

OrderedDictionary value not returning list but object

好吧,我放弃了。这可能是我所缺少的非常简单的东西,但过去 2 个小时我一直坚持这个,我无法在网上的任何地方找到答案。下面的代码在我的 foreach 中的 list 中显示了一个 CS1579 错误:

"foreach statement cannot operate on variables of type 'object' because 'object' does not contain a public definition for 'GetEnumerator'".

我的 roomList[roomNameTest] return 不应该是 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 类型,.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);
      }
  }

OrderedDictionary 不是通用的 class,因此它仅适用于 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);
    }
}