【问题标题】:OrderedDictionary value not returning list but object [duplicate]OrderedDictionary 值不返回列表而是返回对象 [重复]
【发布时间】: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,我会感到惊讶

标签: c# dictionary 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 但错误已经告诉我输出不是,尽管给了我一种使用代码检测它的方法,但它并没有解决问题。
    猜你喜欢
    • 2021-07-05
    • 2015-03-25
    • 2019-03-17
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 2021-04-28
    相关资源
    最近更新 更多