【问题标题】:Get count of values in dictionary list获取字典列表中的值计数
【发布时间】:2021-09-01 23:45:44
【问题描述】:

我的 C# 应用程序有一个类型为 Dictionary<string, object> 的值变量。该变量具有以下值:

{
  "playerHeight":1.7654838562011719,
  "armSpan":1.22609281539917,
  "TestType":true,
  "Symptoms":[
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0
  ],
  "RightHanded":true,
  "RightFooted":true
}

我正在尝试创建一个变量,该变量是Symptoms 键持有的值的计数。这是我得到的代码:

var partIds = values.Where(kvp => kvp.Key.Equals("Symptoms")).ToList();

当我随后在 for 循环中使用 partIds 时,如下所示,计数为 0,尽管对于上面的示例它应该为 21:

for (int i = 0; i < partIds.Count(); i++)
{
    ...
}

我试图了解我在创建变量时使用的代码是否不正确。

【问题讨论】:

  • 请您编辑您的问题以包含minimal reproducible example,并格式化JSON?我现在很难看出代码与 JSON 的关系 - 部分原因是 JSON 的 Symptoms 部分位于一行的一半,它有 649 个字符长……这让人们更难来帮助你。
  • (我们也看不到您的任何类 - 并且您以非常规的方式命名局部变量并将它们与 classes 同名的事实使得它特别令人困惑。)
  • 对不起。我整理了一下,重新提出了这个问题。希望它更清楚一点
  • 它仍然不是很清楚 - 它绝对不是minimal reproducible example。你是如何创建字典的?如果你有一本字典,为什么要遍历整个字典而不是使用values["Symptoms"]?请注意,使用您当前的代码,我希望 partIds 的计数为 1,因为有 1 个字典条目与键 Symptoms。同样,这是 minimal reproducible example 可以避免混淆的地方。

标签: c# .net dictionary


【解决方案1】:

也许您示例中的这个简单代码可以帮助您:

Dictionary<string, object> dict = new Dictionary<string, object>()
        {
            { "playerHeight",1.7654838562011719},
            { "armSpan",1.22609281539917},
            { "TestType",true},
            { "Symptoms",new [] {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 } },
            { "RightHanded",true },
            { "RightFooted",true}
        };
Console.Write((dict["Symptoms"] as int[]).Count());

【讨论】:

    【解决方案2】:

    因为变量是Dictionary&lt;string, object&gt;。您可以使用键索引访问它。

    var partIds = ((IEnumerable<int>)dict["Symptoms"]).ToList();
    

    您的原始方法将过滤KeyValuePair 列表。那应该是

    var partIds = ((IEnumerable<int>)dict.Where(kvp => kvp.Key.Equals("Symptoms")).FirstOrDefault().Value).ToList();
    

    【讨论】:

      【解决方案3】:

      你可以试试

      
         object symptObj;
         if(values.TryGetValue("Symptoms", out symptObj) && symptObj!=null)
         {
            if(symptObj is IEnumerable)
            {
               var partIds = ((IEnumerable)symptObj).ToList();
      
               for (int i = 0; i < partIds.Count(); i++)
               {
                  //[...]
               }
            }
          }
      
      

      【讨论】:

      • 不,Where 总是 返回匹配元素的序列。我希望它在这里返回一个条目 - 其中值将是列表或数组。不幸的是,虽然我们在问题中没有完整的示例,但很难确切知道发生了什么。
      • 好的,我已经编辑了我的答案以删除该部分,@JonSkeet,感谢您的评论。但是,如果您希望与“症状”关联的值是和 IEnumerabled,那么使用 tryGetValue 应该可以工作,对吧?
      • 是的,我希望它会。但是我希望当前代码给出的结果与报告的不同,所以我真的不认为值得猜测什么可能有效,而我们几乎没有可靠的信息。
      猜你喜欢
      • 2013-08-22
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多