查找以按属性值提供集合成员计数

时间:2019-05-17 20:14:59

标签: c# linq

public class Person
{
    string Name {get; set;}
    int Age {get; set;}
}

public List<Person> persons;

我需要一个Dictionary<int,int>之类的查询数据结构,该结构可以提供一个年龄段给我该年龄段的人数。

编辑:这是答案:

return persons.GroupBy(m => m.Age).ToDictionary(g => g.Key, g => g.Count());

希望可以帮助遇到此帖子的其他人。

2 个答案:

答案 0 :(得分:2)

就是这么简单。

var counts = persons.GroupBy( p => p.Age ).ToDictionary( g => g.Key, g => g.Count() )

答案 1 :(得分:0)

解决方案:

//Query Syntax
var counts = (from p in persons
              group p by p.Age)
              .ToDictionary(x => x.Key, x => x.Count());

//Method Syntax
var counts = persons.GroupBy(p => p.Age).ToDictionary(x => x.Key, x => x.Count());

然后,counts可以用作具有键龄和值计数的字典。

详细说明:

在这种情况下使用GroupBy时,它将创建IEnumerable的{​​{1}}。

此结构与IGrouping类似,但不具有所有相同的属性。 Dictionary本身是IGrouping的实现,在某种程度上类似于电子表格中的列,因为其中的所有值都与IEnumerable绑定在一起,就像列中有一个标头。

然后将其放入Key中,必须将Dictionary展平。为此,必须将每个IEnumerable<IGrouping>转换为IGrouping。 (请注意,它不一定明确是KeyValuePair,但这是有效的结果。)在此示例中,这是通过将每个KeyValuePair的{​​{1}}设置为年龄,而Key的{​​{1}}通常是某种聚合函数,例如KeyValuePairValue,甚至只是关联的KeyValuePair价值本身。

在以下解决方案中,转换步骤一次完成。 Count应用于Sum,它需要做两件事:从每个项目(IEnumerable)获取密钥的方法,以及从每个项目获取值的方法。在当前设置下,每个ToDictionary的{​​{1}}是Age,因此我们将其传递给第一个lambda:IEnumerable<T>。之后,我们为其选择一个值。我们想要具有该年龄的人数,因此表达式为:T

KeyIGrouping之间的主要区别在于,x => x.Key可以具有多个具有相同密钥的x => x.Count(),尽管通常没有理由这样做。