[英]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);
有关如何使用自定义比较器的快速示例:
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.