简体   繁体   English

如何将数组升序排序但最后置0?

[英]How sort array in ascending order but put 0 at last?

sort array in that manner that sorted array's member starts in ascending order but o value comes at last in c# 排序数组的方式是,排序数组的成员以升序开始,但o值最后出现在c#中

ulong[] arr = new ulong[30];

arr[0]=13325647855656;
arr[1]=65897426666332;
arr[2]=00685956265661;
arr[4]=0;

then output must be 然后输出必须是

arr[0]=00685956265661;
arr[1]=13325647855656;
arr[2]=65897426666332;
arr[4]=0;

you can use Linq OrderBy and ThenBy 您可以使用Linq OrderByThenBy

ulong[] arr = new ulong[30];
arr[0] = 13325647855656;
arr[1] = 65897426666332;
arr[2] = 00685956265661;
arr[4] = 0;

var results = arr.OrderBy(x => x == 0).ThenBy(x => x);

You can use Array.Sort with this custom comparison delegate : 您可以将Array.Sort与此自定义比较委托一起使用

Array.Sort(arr, (u1, u2) =>
    {
        if (u1 == 0 && u2 == 0) return 0;
        else if (u1 == 0) return ulong.MaxValue.CompareTo(u2);
        else if (u2 == 0) return u1.CompareTo(ulong.MaxValue);
        else return u1.CompareTo(u2);
    });

Demo 演示版

If you want to use Linq ( ToArray() needs to create an additonal array internally), i would use: 如果要使用Linq( ToArray()需要在内部创建一个附加数组),我将使用:

arr = arr.OrderBy(x => x == 0).ThenBy(x => x).ToArray();
class ZeroIsBigComparer : System.Collections.Generic.IComparer<ulong>
    {
        public int Compare(ulong x, ulong y)
        {
            if (x == y) return 0;
            if (x == 0) return 1;
            if (y == 0) return -1;
            return x.CompareTo(y);
        }
    }

then 然后

var comparer = new ZeroIsBigComparer();
arr = arr.OrderBy(x => x, comparer).ToArray();

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

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