【问题标题】:How to count occurrences of int value in nested dictionary in c#如何在c#中计算嵌套字典中int值的出现次数
【发布时间】:2016-11-07 11:50:26
【问题描述】:

我在看字典

Dictionary<string, Dictionary<string, int>> personStats

在我的代码中,它会自动生成具有一组特定键 + 值的新“人员”(键)。第一个“字符串”是名称,在嵌套字典中,您有诸如“年龄”、“身高”、“性别”之类的字符串,并带有一个附加的 int 值。

示例:John 年龄:20,身高:180,性别:0(0 代表男性)。

在我的情况下,我想计算特定字符串上的特定 int 值出现了多少次。示例:我的字典中有 100 个人(键),我想知道有多少人的确切“年龄”为 43。

我尝试过使用.Count。示例:personStats.Count(),但它当然会计算第一个字符串(更不用说它没有考虑到我想计算一个特定的 int 值)。我也尝试过foreach,但我不知道如何输入嵌套字典来查找字符串“

编辑:我如何生成新密钥的示例。参数(personname,statType,value)来自其他方法。

public void SetPersonStats(string personname, string statType, int value)
{

    if (personStats.ContainsKey(personname) == false)
    {
        personStats[personname] = new Dictionary<string, int>();
    }

    personStats[personname][statType] = value;
}

所以参数可以是 (John, age, 20), and (John, height, 180), and (John, gender, 0)。所以最后我会得到带有 3 个附加字符串 + 值的条目(?)约翰:age=20,heigh=180,gender=0。所以想象一下,我运行了 100 次,得到了 100 个随机年龄的不同名字,我想计算有多少人的年龄是 43 岁。

【问题讨论】:

  • 你能举几个例子数据吗?生成一个带有一些示例值的值,以及您所期望的值。
  • 嗨。我会尝试(我的代码是一团糟,因为我正在努力学习)。

标签: c# dictionary nested


【解决方案1】:

这应该会为您获取 42 岁的用户数量:

personStats.Count(c => c.Value["age"] == 42);

不过,理想情况下,您应该使用一个类来定义人。类似的东西

enum Gender
{
     Male,
     Female
}
class PersonStats
{
    int Age;
    int Height;
    Gender Gender;
}


//Add to the dictionary
var dict = Dictionary<string, PersonStats>();
dict.Add("FrankerZ", new PersonStats{
   Age = 28,
   Height = 180,
   Gender = Gender.Male
});

//Some example filters:
dict.Count(person => person.Age == 28); //1
dict.Count(person => person.Gender == Gender.Male); //1

【讨论】:

  • 您是否需要先使用 SelectMany 将其展平,因为人员属性位于嵌套字典中,并且不能简单地作为 personStats 的一部分访问?因此 personStats kvps 将由名称和人员属性字典组成。
  • 谢谢!这简直是​​完美的——而且是 ofc。有效!我会研究你的理想版本。但我还是个新手,所以我必须一步一步地采取一切措施。
【解决方案2】:

你可以用 Linq 来统计这个:

var NumberPersonsAged43 =  personStats.SelectMany(p => p.Value["age"] == 43).Count();

这会使用SelectMany 扁平化您的嵌套字典。

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 1970-01-01
    • 2021-11-25
    • 2016-09-23
    • 2018-12-30
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多