首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用IComparer进行分组和排序

使用IComparer进行分组和排序
EN

Stack Overflow用户
提问于 2016-10-19 13:11:23
回答 2查看 392关注 0票数 2

我正试图将IComprarer用于一种复杂的类型。我有一个复杂的类型(为了简单起见,有三个ints):

代码语言:javascript
复制
ID | A | B
1  | 1 | 10
2  | 3 | 20
3  | 1 | 30
4  | 3 |  5
5  | 2 | 15

我需要按B分类,但我需要保持A在一起。B可以是ASC或DESC,但我不能将'A‘分开

它必须这样做:

代码语言:javascript
复制
ID | A | B
3  | 1 | 30
1  | 1 | 10
2  | 3 | 20
4  | 3 |  5
5  | 2 | 15

A顺序没有什么特别之处,重要的是:B是有序的,同样的A不能分开。

我试过:

代码语言:javascript
复制
public int Compare(Comanda x, Comanda y)
{
    if (x.A == y.A) return 0;
    return x.B.CompareTo(y.B);
}

但不起作用,我甚至不知道如何问谷歌,“组”关键词帮不了多少忙。

并且尝试两次排序,显然不起作用(丢弃了B顺序)。

代码语言:javascript
复制
list.Sort(new SortByB());
list.Sort(new SortByA());

我该怎么做呢?谢谢

这不是"C# List<> Sort by x然后y“的复制,因为我不想做双排序。我想要分组

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-19 13:22:38

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

代码语言:javascript
复制
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应该是最大值),然后就可以将结果扁平化。

代码语言:javascript
复制
var sorted = list.OrderByDescending(x => x.B)
            .GroupBy(x => x.A)
            .OrderByDescending(g => g.First().B)
            .SelectMany(g => g);
票数 4
EN

Stack Overflow用户

发布于 2016-10-19 13:15:06

您可以使用orderby,我猜:

代码语言:javascript
复制
var sorted = list.orderby(comanda=>commanda.B).thenby(comanda=>commanda.A);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40132383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档