2013-02-22 87 views
-1

在方式分类排列的成员排序阵列开始按升序排列,但O值来最后在C#如何按升序排序数组,但最后放0?

ulong[] arr = new ulong[30]; 

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

然后输出必须

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

从0到n - 2 – 2013-02-22 07:57:56

+0

你试过了什么?如果你知道如何对数组进行排序,那么它不是那么困难 – exexzian 2013-02-22 07:58:23

+0

@Bingo:我试过Array.sort(arr);但它首先给出0。 – Kevan 2013-02-22 08:12:40

回答

5

您可以使用Array.Sort与此自定义comparison delegate

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

如果你想使用Linq(ToArray()需要在内部创建产生额外阵列),我会用:

arr = arr.OrderBy(x => x == 0).ThenBy(x => x).ToArray(); 
+0

在这种情况下,它实际上并不需要将其与Max进行比较,而且其余的是多余的 – 2013-02-22 08:25:02

+0

@Tim Schmelter:谢谢! – Kevan 2013-02-22 08:25:42

7

可以使用LinqOrderByThenBy

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); 
0
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); 
     } 
    } 

然后

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

如果你想使用Linq(并创建一个额外的数组),无论如何,我更喜欢'arr.OrderBy(x => x == 0).ThenBy(x => x)'。 – 2013-02-22 08:16:39

+0

是的,我同意,我upvoted那一个:) – 2013-02-22 08:17:54

+1

我是林克的粉丝,但在这种情况下,它不是正确的工具,因为OP要排序该阵列,他不想创建一些新的。已经有方法对数组(或列表)进行排序,所以当它们更有效时,为什么不使用它们呢? – 2013-02-22 08:21:38