1. ホーム
  2. c#

Linq order by, group by, order by each group?

2023-08-02 19:23:38

質問

次のようなオブジェクトがあります。

public class Student
{
    public string Name { get; set; } 
    public int Grade { get; set; }
}

私は次のクエリを作成したいと思います:学生名によって成績をグループ化し、成績によって各学生グループを順序付けし、各グループ内の最大成績によってグループを順序付けます。

ということで、以下のような感じになります。

A 100
A 80
B 80
B 50
B 40
C 70
C 30

以下のクエリを作成しました。

StudentsGrades.GroupBy(student => student.Name)
    .OrderBy(studentGradesGroup => studentGradesGroup.Max(student => student.Grade));

しかし、これでは IEnumerable IGrouping を返すだけで、中のリストをソートする方法はありません。 foreach クエリでそれを行い、その結果を AddRange .

もっときれいな方法はないのでしょうか?

どのように解決するのですか?

もちろんです。

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

最初のエントリが最も高い評点であることがすでに分かっているので、順序付け後に各グループの最初の評点を取るだけで済ませることができることに注意してください。

そして、それらを表示することができます。

foreach (var group in query)
{
    Console.WriteLine("Group: {0}", group.Name);
    foreach (var student in group.Students)
    {
        Console.WriteLine("  {0}", student.Grade);
    }
}