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

C# LINQ问题:当NumberOfSchools为0时如何正确设置Year字段?

问题:按年份统计不同毕业院校数量,处理无数据年份的Year字段问题

需求是获取yearList中每一年对应的毕业生毕业院校的不同数量数据,示例如下:

nameList: new[]
{
    new Entrant {LastName = "Name", SchoolNumber = 12, Year = 2019},
    new Entrant {LastName = "Name", SchoolNumber = 13, Year = 2019},
    new Entrant {LastName = "Name", SchoolNumber = 12, Year = 2019},
    new Entrant {LastName = "Name", SchoolNumber = 14, Year = 2016},
    new Entrant {LastName = "Name", SchoolNumber = 15, Year = 2016},
    new Entrant {LastName = "Name", SchoolNumber = 12, Year = 2018},
    new Entrant {LastName = "Name", SchoolNumber = 12, Year = 2018},
    new Entrant {LastName = "Name", SchoolNumber = 13, Year = 2018},
    new Entrant {LastName = "Name", SchoolNumber = 12, Year = 2017},
    new Entrant {LastName = "Name", SchoolNumber = 12, Year = 2017}
},
yearList: new[] { 2020, 2017, 2018 },
expected: new[]
{
    new YearSchoolStat {NumberOfSchools = 0, Year = 2020},
    new YearSchoolStat {NumberOfSchools = 1, Year = 2017},
    new YearSchoolStat {NumberOfSchools = 2, Year = 2018}
});

我实现了部分逻辑,但当NumberOfSchools为0时,Year字段会被设为0,不符合预期。当前代码如下:

var groupedYear = yearList.GroupBy(x => x);
var groupedSchoolNumber = groupedYear.Select(y => nameList.Where(x => x.Year == y.Key)).Select(group => group.GroupBy(item => item.SchoolNumber));
var result = groupedSchoolNumber.Select(s => new YearSchoolStat { NumberOfSchools = s.Count(), Year = s.Select(y => y.Select(x => x.Year).FirstOrDefault()).FirstOrDefault() }).OrderBy(x => x.NumberOfSchools);
return result;

期望无数据(NumberOfSchools=0)时,Year能正确对应yearList中的年份。


解决方法

原代码的问题在于,当某个年份没有对应数据时,你试图从空分组中提取Year,自然会得到默认值0。正确的做法是直接保留yearList中的年份值,不要从过滤后的结果中去获取Year。

修正后的代码:

var result = yearList.Select(year => new YearSchoolStat
{
    Year = year,
    NumberOfSchools = nameList
        .Where(x => x.Year == year)
        .Select(x => x.SchoolNumber)
        .Distinct()
        .Count()
})
.OrderBy(x => x.NumberOfSchools);

return result;

代码说明

  • 直接遍历yearList中的每一个年份,确保Year字段始终是目标年份,不会丢失
  • 对每个年份,过滤nameList中对应年份的记录,提取SchoolNumber后去重,最后统计数量,就是该年份的不同院校数
  • 最后按NumberOfSchools排序,和原逻辑一致

这样处理后,即使某个年份没有对应的毕业生数据,Year也会正确保留yearList中的值,NumberOfSchools为0,完全符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:36:34