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

如何用C# LINQ按大学分组并获取每组最高分学生?

如何按大学分组筛选出分数最高的学生?

我有students和universities两个集合,需要按大学名称分组,筛选出每所大学中分数最高的学生,期望结果如下:

CountryNameStudentScore
New YorkNY UniversityBob120
LALA UniversityTom140

我现在写了以下代码:

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
       };

关键说明

  1. 关联修正:原代码中university.Id equals country.Id的关联逻辑错误,应该通过University中的Country.Id与Country的Id匹配,才能拿到对应大学的国家信息。
  2. 学生关联:必须通过University的Student.Id关联Student集合,才能获取学生的Score字段。
  3. 分组筛选:分组时需要将关联后的国家、学生信息一起纳入分组,才能在组内筛选出分数最高的学生。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:45:36