c# - 使用 IComparer 进行分组和排序

标签 c# sorting grouping icomparer

我正在尝试使用 IComprarer 进行复杂排序。 我有这个复杂的类型(为了简单起见,三个整数):

ID | A | B
1  | 1 | 10
2  | 3 | 20
3  | 1 | 30
4  | 3 |  5
5  | 2 | 15

我需要按 B 排序,但我需要将 A 放在一起。 B 可以是 ASC 或 DESC,但我无法分隔 'A'

它必须这样排序:

ID | A | B
3  | 1 | 30
1  | 1 | 10
2  | 3 | 20
4  | 3 |  5
5  | 2 | 15

A 订单中没有什么特别的,重要的是: B是有序的,同一个A不能分开。

我尝试过:

public int Compare(Comanda x, Comanda y)
{
    if (x.A == y.A) return 0;
    return x.B.CompareTo(y.B);
}

但不起作用,我什至不知道如何向谷歌询问,“group”关键字没有多大帮助。

并且还尝试排序两次,这显然不起作用(丢弃了 B 顺序)。

list.Sort(new SortByB());
list.Sort(new SortByA());

我该怎么做? 谢谢

这不是“C# List<> Sort by x then y”的重复,因为我不想进行双重排序。我想分组

最佳答案

对于具体示例,我将执行以下操作。

var sorted = list.GroupBy(x => x.A)
            .OrderByDescending(g => g.Max(x => x.B))
            .SelectMany(g => g.OrderByDescending(x => x.B));

您基本上需要先对 A 进行分组,然后根据 B 的最大值对组进行排序,然后对 B 上每个组中的项目进行排序。

另一种选择是首先对 B 进行排序,然后对 A 进行分组,然后根据组中第一项中的 B 值对组进行排序(这应该是该组的最大 B,因为我们已经对它们进行了排序) ),然后将结果展平。

var sorted = list.OrderByDescending(x => x.B)
            .GroupBy(x => x.A)
            .OrderByDescending(g => g.First().B)
            .SelectMany(g => g);

关于c# - 使用 IComparer 进行分组和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40132383/

相关文章:

c# - 如何以比 C# 中的接口(interface)更宽松的方式定义模板

ruby-on-rails - 从 Ruby on Rails 中的 HashMap 数组中获取排序的最常见对象

php - 如何使用PHP进行SQL的GROUP BY?

matlab - 如何对具有相同列值的行进行分组?

C# 和 Powershell 3.0 对象

c# - 如何同时为一个 C# 类分配多个名称

ruby-on-rails - 在 ruby​​ in rails 中按日期降序排序

java - 如何对 <Integer, MyObject> map 进行排序

c# - 如何在 Windows 任务栏中对不同的应用程序进行分组?

c# - 在 ASP.NET Web 窗体应用程序中本地化 JavaScript 字符串