如何用LINQ按年龄区间分组并统计各区间男女数量?
问题描述
我拥有如下Person类型数组数据:
var data = new Person[]{ new Person{ Gender = "male", Age = 7, }, new Person{ Gender = "female", Age = 14, }, new Person{ Gender = "male", Age = 12, }, new Person{ Gender = "male", Age = 8, }, new Person{ Gender = "male", Age = 18, }, new Person{ Gender = "female", Age = 18, }, new Person{ Gender = "male", Age = 7, } };
我希望按5岁间隔的年龄区间对该数据分组,统计每个区间内男性和女性的数量。尝试了以下代码:
var grouped = data.GroupBy(d => new { age = 5 * (d.Age / 5), d.Gender }).Select(d => new { range = $"{d.Key.age}-{d.Key.age + 4}", male = d.Count(x => x.Gender == "male"), female = d.Count(x => x.Gender == "female") }).Dump("grouped");
得到的结果中年龄区间存在重复,每个区间被拆分为男女两行:
| range | male | female |
|---|---|---|
| 5-9 | 3 | 0 |
| 10-14 | 0 | 1 |
| 10-14 | 1 | 0 |
| 15-19 | 1 | 0 |
| 15-19 | 0 | 1 |
但期望得到每个年龄区间仅一行,合并男女计数的结果:
| range | male | female |
|---|---|---|
| 5-9 | 3 | 0 |
| 10-14 | 1 | 1 |
| 15-19 | 1 | 1 |
请问该如何修改代码实现需求?
解决方案
问题出在分组依据包含了Gender,导致同一个年龄区间会因性别不同被拆分成多个分组。正确的做法是先按年龄区间分组,再在每个分组内统计男女数量:
修改后的代码如下:
var grouped = data // 仅按年龄区间分组,不包含性别 .GroupBy(d => 5 * (d.Age / 5)) .Select(g => new { range = $"{g.Key}-{g.Key + 4}", // 在当前年龄区间分组内统计男性数量 male = g.Count(x => x.Gender == "male"), // 在当前年龄区间分组内统计女性数量 female = g.Count(x => x.Gender == "female") }) .Dump("grouped");
代码说明
- 调整分组逻辑:将
GroupBy的键改为仅包含年龄区间计算结果5 * (d.Age / 5),确保同一个年龄区间的所有数据被分到同一组,不会因性别拆分。 - 分组内统计:在每个年龄分组中,直接用
Count分别统计男性和女性的数量,每个区间只会生成一行结果,完全匹配期望输出。
内容的提问来源于stack exchange,提问作者Isaac Ikusika
相关产品推荐
相关产品推荐

