使用IComparer进行分组和排序

本文关键字:排序 IComparer 使用 | 更新日期: 2023-09-27 18:13:41

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

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

顺序没有什么特别的,重要的是: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"的重复,因为我不想做双重排序。我想把

使用IComparer进行分组和排序

分组

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

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

我猜你可以使用order:

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