C# 使用IComparer进行分组和排序
我正在尝试使用iCompraer进行复杂排序。 我有这个复杂类型(为了简单起见,有三个整数): 我需要按B排序,但我需要把A放在一起。 B可以是ASC或DESC,但我不能将“A”分开 它必须这样订购: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)
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);