使用 IComparer 进行分组和排序
Using IComparer for grouping and sorting
我正在尝试使用 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);
}
但是不起作用,我什至不知道如何向 google 询问它,"group" 关键字没有多大帮助。
并且还尝试了两次排序,这显然不起作用(丢弃了 B 顺序)。
list.Sort(new SortByB());
list.Sort(new SortByA());
我该怎么做?
谢谢
这不是 "C# List<> Sort by x then y" 的副本,因为我不想进行双重排序。我想 GROUP
我猜你可以使用 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);
我正在尝试使用 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);
}
但是不起作用,我什至不知道如何向 google 询问它,"group" 关键字没有多大帮助。
并且还尝试了两次排序,这显然不起作用(丢弃了 B 顺序)。
list.Sort(new SortByB());
list.Sort(new SortByA());
我该怎么做? 谢谢
这不是 "C# List<> Sort by x then y" 的副本,因为我不想进行双重排序。我想 GROUP
我猜你可以使用 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);