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
相关产品推荐
相关产品推荐

