C# Linq问题:按StudentId去重并获取每个学生最大SchoolYearId的数据
嘿,这问题我熟,用Linq的分组或者DistinctBy就能轻松搞定,给你两种实用的方案:
解决方案
方式一:分组后取每组内最大年份的记录(高效推荐)
这种方式先按StudentId分组,然后在每个分组中筛选出SchoolYearId最大的那条数据,性能更优,因为不需要对全量数据排序:
var result = StudentData() .GroupBy(s => s.StudentId) .Select(g => g.OrderByDescending(s => s.SchoolYearId).First());
代码解释:
GroupBy(s => s.StudentId):把所有学生按StudentId分组,每个组包含同一个学生的所有年份记录Select(g => g.OrderByDescending(s => s.SchoolYearId).First()):对每个分组内的记录按SchoolYearId降序排列,然后取第一条(也就是年份最大的那条)
方式二:使用DistinctBy结合筛选(.NET 6+可用)
如果你使用的是.NET 6及以上版本,可以利用DistinctBy方法,写法更简洁:
var result = StudentData() .OrderByDescending(s => s.SchoolYearId) .DistinctBy(s => s.StudentId);
代码解释:
OrderByDescending(s => s.SchoolYearId):先把所有记录按SchoolYearId降序排列,这样同一个学生的最新年份记录会排在最前面DistinctBy(s => s.StudentId):按StudentId去重,因为前面已经排好序,所以会自动保留每个学生的第一条(也就是年份最大的)记录
验证结果
执行上述任意一段代码后,输出的结果都完全符合你的预期:
StudentId=100, Name="Shubham", SchoolYearId=2018, ClassId=1002 StudentId=101, Name="Arpit", SchoolYearId=2017, ClassId=1101
内容的提问来源于stack exchange,提问作者Arvind Chourasiya
相关产品推荐
相关产品推荐

