You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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");

得到的结果中年龄区间存在重复,每个区间被拆分为男女两行:

rangemalefemale
5-930
10-1401
10-1410
15-1910
15-1901

但期望得到每个年龄区间仅一行,合并男女计数的结果:

rangemalefemale
5-930
10-1411
15-1911

请问该如何修改代码实现需求?


解决方案

问题出在分组依据包含了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");

代码说明

  1. 调整分组逻辑:将GroupBy的键改为仅包含年龄区间计算结果5 * (d.Age / 5),确保同一个年龄区间的所有数据被分到同一组,不会因性别拆分。
  2. 分组内统计:在每个年龄分组中,直接用Count分别统计男性和女性的数量,每个区间只会生成一行结果,完全匹配期望输出。

内容的提问来源于stack exchange,提问作者Isaac Ikusika

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:35:11