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&lt;string, List&lt;string&gt;&gt;() 效果非常好,我稍后根据需要使用OrderBy(x =&gt; x.Key) 对字典进行排序。感谢大家的贡献,非常感谢。

【问题讨论】:

OrderedDictionary 不是泛型类,因此它仅适用于 objects。您将需要转换或使用不同类型的集合。您真的需要订购吗? 不,如果 roomList["roomA"]object var list = (List&lt;string&gt;)roomList[roomNameTest]; 将修复它(在这种情况下) 如果您想使用字典,为什么必须订购您的收藏? 如果您先使用Dictionary&lt;string, List&lt;string&gt;&gt;,然后使用roomList.ContainsKey,则此代码可以正常工作。如果您真的需要坚持使用OrderedDictionary,我会感到惊讶 【参考方案1】:

OrderedDictionary 不是泛型类,因此它仅适用于objects。您将需要转换或使用不同类型的集合。例如:

var list = (List<string>) roomList[roomNameTest];

但是,如果您在字典中添加不是 &lt;List&lt;string&gt; 的内容,这可能会导致问题。

另外,我不确定您是否需要在这里使用OrderedDictionary,而强类型的Dictionary&lt;string, List&lt;string&gt;&gt; 会好得多。例如:

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&lt;string&gt; 并成功循环:

  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 值不返回列表而是返回对象 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

没有OrderedDictionary的通用实现?

swift OrderedDictionary.swift

如果 web api json 转换器中的输入值不正确,我需要抛出啥异常,以便服务器返回 400 而不是 500?

python 列表,元组,字符串 切片 超出索引值不报错

当项目与数据库中的值不相等时如何取回列表的数据源

在 for 循环期间为列表中的项目分配新值不起作用?