首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linq order by、group by和order by各组?

Linq order by、group by和order by各组?
EN

Stack Overflow用户
提问于 2011-02-16 15:36:01
回答 5查看 153.7K关注 0票数 79

我有一个对象,看起来像这样:

代码语言:javascript
复制
public class Student
{
    public string Name { get; set; } 
    public int Grade { get; set; }
}

我想创建以下查询:按学生姓名对成绩进行分组,按成绩对每个学生组进行排序,并按每个组中的最高成绩对组进行排序。

所以它看起来像这样:

代码语言:javascript
复制
A 100
A 80
B 80
B 50
B 40
C 70
C 30

我创建了以下查询:

代码语言:javascript
复制
StudentsGrades.GroupBy(student => student.Name)
    .OrderBy(studentGradesGroup => studentGradesGroup.Max(student => student.Grade));

但是这将返回IEnumerable IGrouping,并且我无法在内部对列表进行排序,除非在另一个foreach查询中对列表进行排序,并使用AddRange将结果添加到不同的列表中。

有没有更好的方法呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-02-16 15:40:50

当然:

代码语言:javascript
复制
var query = grades.GroupBy(student => student.Name)
                  .Select(group => 
                        new { Name = group.Key,
                              Students = group.OrderByDescending(x => x.Grade) })
                  .OrderBy(group => group.Students.First().Grade);

请注意,您可以在排序后只取每个组中的第一个分数,因为您已经知道第一个条目将具有最高分数。

然后,您可以使用以下命令显示它们:

代码语言:javascript
复制
foreach (var group in query)
{
    Console.WriteLine("Group: {0}", group.Name);
    foreach (var student in group.Students)
    {
        Console.WriteLine("  {0}", student.Grade);
    }
}
票数 149
EN

Stack Overflow用户

发布于 2013-07-08 22:51:51

不使用投影的方法:

代码语言:javascript
复制
StudentsGrades.OrderBy(student => student.Name).
ThenBy(student => student.Grade);
票数 19
EN

Stack Overflow用户

发布于 2011-02-16 15:41:13

我认为您需要一个额外的投影,将每个组映射到该组的一个排序版本:

代码语言:javascript
复制
.Select(group => group.OrderByDescending(student => student.Grade))

在此之后,您可能还需要另一个展平操作,该操作将为您提供一个学生序列,而不是一个组序列:

代码语言:javascript
复制
.SelectMany(group => group)

您始终可以将两者合并为一个SelectMany调用,该调用同时执行投影和展平。

编辑:正如Jon Skeet指出的那样,整个查询中存在一定的低效;通过对每个组进行排序而获得的信息并未用于组本身的排序。通过将每个组的排序移到组本身的排序之前,可以将Max查询转移到更简单的First查询中。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5013710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档