如何用C# LINQ按大学分组并获取每组最高分学生?
如何按大学分组筛选出分数最高的学生?
我有students和universities两个集合,需要按大学名称分组,筛选出每所大学中分数最高的学生,期望结果如下:
| Country | Name | Student | Score |
|---|---|---|---|
| New York | NY University | Bob | 120 |
| LA | LA University | Tom | 140 |
我现在写了以下代码:
return from university in Universities join country in Countries on university.Id equals country.Id orderby country.Name group university by university.Name into g select new { g.Key, maxScore = g.Max(student => student.Score) // 报错:student.Score仅在Students类中可用 };
问题在于University实体仅包含学生ID,字段如下:
int Country.Id, string Name, int Student.Id
Student实体字段为:
Id, Name, Score
我想知道如何在分组g中获取分数最高的那一位学生。
解决方案
你需要先将University与Student关联(通过Student.Id匹配),才能获取学生的分数信息,再关联Country拿到国家名称,最后分组筛选每组分数最高的学生。
.NET 6+ 版本(使用MaxBy更简洁)
return from university in Universities // 关联University和Student,匹配学生ID join student in Students on university.Student.Id equals student.Id // 关联University和Country,匹配国家ID(修正原代码的关联逻辑) join country in Countries on university.Country.Id equals country.Id // 按大学名称分组,保存关联后的国家、学生信息 group new { country, student } by university.Name into universityGroup // 直接获取分组内分数最高的学生 let topStudentEntry = universityGroup.MaxBy(item => item.student.Score) // 投影出需要的结果字段 select new { Country = topStudentEntry.country.Name, Name = universityGroup.Key, Student = topStudentEntry.student.Name, Score = topStudentEntry.student.Score };
兼容旧版本.NET(使用OrderByDescending)
如果你的项目基于.NET 5及以下版本,没有MaxBy方法,可以用排序后取第一个的方式:
return from university in Universities join student in Students on university.Student.Id equals student.Id join country in Countries on university.Country.Id equals country.Id group new { country, student } by university.Name into universityGroup // 按分数降序排序后取第一个,即分数最高的学生 let topStudentEntry = universityGroup.OrderByDescending(item => item.student.Score).FirstOrDefault() select new { Country = topStudentEntry.country.Name, Name = universityGroup.Key, Student = topStudentEntry.student.Name, Score = topStudentEntry.student.Score };
关键说明
- 关联修正:原代码中
university.Id equals country.Id的关联逻辑错误,应该通过University中的Country.Id与Country的Id匹配,才能拿到对应大学的国家信息。 - 学生关联:必须通过
University的Student.Id关联Student集合,才能获取学生的Score字段。 - 分组筛选:分组时需要将关联后的国家、学生信息一起纳入分组,才能在组内筛选出分数最高的学生。
内容的提问来源于stack exchange,提问作者UntitledUserForEach
相关产品推荐
相关产品推荐

