c# - 我想基于字符串和 int 对 Linq 中的组内的对象进行排序

标签 c# linq entity-framework

我有一个练习对象,它同时具有 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/

相关文章:

c# - ASP.NET EntityFramework 获取数据库名称

c# - 如何使用 .NET SqlDependency 处理连接丢失

c# - LINQ to Entities 无法识别自定义方法

c# - Entity Framework -使用存储过程急于加载对象图

sql - Linq to NHibernate 生成多个连接到同一个表

c# - EPPlus 的通用 Excel 生成器函数

c# - 同一实体中的 EF 4 关系

C# .NET 生成一次字符串数组,其索引是表中的字符串值

c# - Accord.NET AdaBoost Decide 方法在哪里?

c# - IEnumerable foreach,对最后一个元素做一些不同的事情