我有一个练习对象,它同时具有 ID 和类别。为了解决这个问题,我们假设它看起来像这样:
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 对组进行排序,但是可惜。
我尝试将 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();
关于c# - 我想基于字符串和 int 对 Linq 中的组内的对象进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23112928/