我有一个同时具有ID和类别的Exercise对象。出于这个问题的目的,让我们假设它看起来像这样:

public class Exercise
{
    public int ID;
    public string category;
}


ID是唯一的,类别不是。

我想使用Linq将练习按类别分组,然后再根据其ID在每个类别中对练习进行排序。类别的顺序也应基于ID,第一次练习的类别应始终是对练习进行分组后的第一类别。 (换句话说,组的顺序应由每个组中第一个对象的ID确定,这些ID的顺序应与组的顺序匹配。)

例:

{ ID: 1, category: "C#" }
{ ID: 2, category: "ASP" }
{ ID: 3, category: "C#" }


ID为1和3的对象应位于ID为2的对象之前,尽管ASP按字母顺序位于C#之前。

这是我的LINQ代码:

_db.Exercise.GroupBy(item => item.category)
            .OrderBy(group => group.FirstOrDefault().ID)
            .SelectMany(group => group)
            .ToList();


它将练习按我期望的方式进行分组,但是无论我做什么,分组的顺序都是按字母顺序进行的。我期望在组上使用OrderBy来订购组,但是a。

我尝试将OrderBy放在不同的地方,但没有成功。而且仅使用OrderBy似乎不起作用。将ID和类别都作为键的GroupBy似乎也不起作用。

谁能帮帮我吗?这是我第一次在LINQ中尝试这种“高级”的方法。提前致谢。

最佳答案

您只需按ID排序,然后按Category分组即可获得所需的内容:

_db.Exercise.OrderBy(item => item.ID)
            .GroupBy(item => item.category)
            .SelectMany(group => group)
            .ToList();


结果:

List<> (3 items)
ID   category
---- ---------
1    C#
3    C#
2    ASP


由于根据the documentation,将按键在列表中出现的顺序返回组,因此将基于每个组中的第一个ID对组进行排序。

正如@Servy指出的那样,由于组的顺序是实现细节,因此您可以显式地对组进行排序:

_db.Exercise.OrderBy(item => item.ID)
            .GroupBy(item => item.category)
            .OrderBy(g => g.First().ID)
            .SelectMany(group => group)
            .ToList();

09-04 21:31
查看更多