【问题标题】:Using IComparer for grouping and sorting使用 IComparer 进行分组和排序
【发布时间】:2017-08-11 20:53:45
【问题描述】:

我正在尝试使用 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);
}

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

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

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

我该怎么做? 谢谢

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

【问题讨论】:

  • 看起来您想按 A 分组,然后在每个分组中按最大 B 排序,并按 B 对组中的项目进行排序。这不能用 IComparer 完成。跨度>
  • @Sebi 不是。我不想要双重排序,我想要 GROUP 然后排序

标签: c# sorting grouping icomparer


【解决方案1】:

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

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);

【讨论】:

  • 拯救了我的一天!太感谢了 ! (我不知道 GroupBy 和 SelectMany,我会阅读更多相关信息)
【解决方案2】:

我猜你可以使用 orderby:

var sorted = list.orderby(comanda=>commanda.B).thenby(comanda=>commanda.A);

【讨论】:

    猜你喜欢
    • 2012-12-29
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    相关资源
    最近更新 更多