使用IComparer进行分组和排序

时间:2016-10-19 13:11:24

标签: 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<>的副本按x排序然后按y"因为我不想做双重排序。我想要GROUP

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

我可以使用orderby:

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