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());
希望可以帮助遇到此帖子的其他人。
答案 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}}通常是某种聚合函数,例如KeyValuePair
或Value
,甚至只是关联的KeyValuePair
价值本身。
在以下解决方案中,转换步骤一次完成。 Count
应用于Sum
,它需要做两件事:从每个项目(IEnumerable
)获取密钥的方法,以及从每个项目获取值的方法。在当前设置下,每个ToDictionary
的{{1}}是Age,因此我们将其传递给第一个lambda:IEnumerable<T>
。之后,我们为其选择一个值。我们想要具有该年龄的人数,因此表达式为:T
。
Key
和IGrouping
之间的主要区别在于,x => x.Key
可以具有多个具有相同密钥的x => x.Count()
,尽管通常没有理由这样做。