C# LINQ如何按release_number分组获取每组最大year值
问题说明
现有列表包含如下结构的条目数据:
{ surname = surname_1, title = title_4, release_number = 111, year = 2021 } { surname = surname_1, title = title_1, release_number = 111, year = 2020 } { surname = surname_2, title = title_5, release_number = 222, year = 2021 } { surname = surname_2, title = title_2, release_number = 222, year = 2020 } { surname = surname_3, title = title_8, release_number = 222, year = 2022 }
需要使用C# LINQ实现:获取每个release_number对应的最大year值,期望输出结果为:
{ReleaseNumber = 111, Year = 2021} {ReleaseNumber = 222, Year = 2022}
实现方案
首先定义和数据结构匹配的实体类,假设数据源为List<Record>类型,变量名为records:
public class Record { public string Surname { get; set; } public string Title { get; set; } public int ReleaseNumber { get; set; } public int Year { get; set; } }
核心实现逻辑是按release_number字段分组,对每个分组取year字段的最大值,有两种常见写法:
- 方法语法(日常开发最常用)
var result = records .GroupBy(item => item.ReleaseNumber) .Select(group => new { ReleaseNumber = group.Key, Year = group.Max(i => i.Year) }) .ToList();
- 查询表达式写法
var result = from item in records group item by item.ReleaseNumber into releaseGroup select new { ReleaseNumber = releaseGroup.Key, Year = releaseGroup.Max(i => i.Year) };
逻辑说明
GroupBy会把ReleaseNumber相同的条目归为同一组,每组的Key属性就是对应的ReleaseNumber值- 对每个分组调用
Max方法,传入取Year字段的选择器,就能得到当前分组下的最大年份 - 上述代码输出的是匿名类型集合,属性和值完全匹配预期结果,如果需要强类型返回,直接把匿名类型替换为自定义的输出DTO类即可
内容的提问来源于stack exchange,提问作者Yura Solokha
相关产品推荐
相关产品推荐

