我有一个同时具有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();