繁体   English   中英

我该如何排序,但将零置于底部?

[英]How can I sort but put zeros at the bottom?

我有一个具有属性Rank的对象列表。 这是一个整数。

我希望按照我的观点排名,但是当我这样做时:

  myObjects = myObjects.Orderby(r=>r.Rank);

我得到了所有的零(意思是这些没有设置在顶部)

我想按1 - > n排序,但是零位于列表的底部。

我希望它尽可能高效,因为列表很长

LINQ:

myObjects = myObjects
    .OrderBy(r => r.Rank == 0) //false before true
    .ThenBy(r => r.Rank);

事实上这并不会做两个全排序。 它将两个lambdas组合成两个键的单个字典排序。

如果你对不那么明显的false - true规则感到不舒服,你可以用r => r.Rank == 0 ? 1 : 0替换第一个lambda r => r.Rank == 0 ? 1 : 0 r => r.Rank == 0 ? 1 : 0 - 但是,知道false true规则使得这似乎真的是多余的。

您可以创建自定义比较器(实现IComparer )并将其排序到底部。 伪代码将是:

public class ZeroComparer : IComparer {
    public int Compare(Object intA, Object intB) {
        if(intA == 0 && intB != 0)
            return -1;
        if(intA != 0 && intB == 0)
            return 1;
        return int.Compare(intA, intB);
    }
}

然后使用它像:

var comparer = new ZeroComparer();
myObjects = myObjects.Orderby(r=>r.Rank, comparer);

有关如何使用自定义比较器的快速示例:

使用自己的IComparer <T>和Linq OrderBy

myObjects = myObjects.Orderby(r => r.Rank == 0 ? int.MaxValue : r.Rank);

处理案例Rank == int.MaxValue

myObjects = myObjects.Orderby(r => r.Rank == 0 ? int.MaxValue : r.Rank - 1);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM