C# 使用IComparer进行分组和排序

C# 使用IComparer进行分组和排序,c#,sorting,grouping,icomparer,C#,Sorting,Grouping,Icomparer,我正在尝试使用iCompraer进行复杂排序。 我有这个复杂类型(为了简单起见,有三个整数): 我需要按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)

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

我需要按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顺序)

我怎么做? 谢谢


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

您可以使用orderby,我想:

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

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

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

看起来您希望按A分组,然后在每个分组中按最大B排序,并按B排序分组中的项目。这是使用
IComparer
无法完成的。可能与@Sebi重复,但不是这样。我不想要双重排序,我想要的是分组,然后就把我的日子搞砸了!非常感谢你!(我不知道GroupBy和SelectMany,我将了解更多)
var sorted = list.GroupBy(x => x.A)
            .OrderByDescending(g => g.Max(x => x.B))
            .SelectMany(g => g.OrderByDescending(x => x.B));
var sorted = list.OrderByDescending(x => x.B)
            .GroupBy(x => x.A)
            .OrderByDescending(g => g.First().B)
            .SelectMany(g => g);