以降序排序数组的更好方法

san*_*ngh 50 c# linq sorting

我有一个int数组,我必须通过降序排序.

因为我没有找到任何方法来按降序对数组进行排序.目前我按降序对数组进行排序,如下所示

int[] array = new int[] { 3, 1, 4, 5, 2 };
Array.Sort<int>( array );
Array.Reverse( array );
Run Code Online (Sandbox Code Playgroud)

现在,问题是.在c#中有更好的方法吗?

Ily*_*gin 62

使用LINQ OrderByDescending方法.它返回IOrderedIEnumerable<int>,如果需要,可以将其转换回Array.通常,List<>s比s更具功能Array.

array = array.OrderByDescending(c => c).ToArray();
Run Code Online (Sandbox Code Playgroud)

  • 这是一个简短的工作代码,但如果数组很大,则效率不高(在性能方面),因为数组首先转换为列表,然后排序,最后转换为数组.我错了吗 ? (6认同)

JYL*_*JYL 56

根据排序顺序,您可以执行以下操作:

    int[] array = new int[] { 3, 1, 4, 5, 2 };
    Array.Sort<int>(array,
                    new Comparison<int>(
                            (i1, i2) => i2.CompareTo(i1)
                    ));
Run Code Online (Sandbox Code Playgroud)

... 或这个 :

    int[] array = new int[] { 3, 1, 4, 5, 2 };
    Array.Sort<int>(array,
                    new Comparison<int>(
                            (i1, i2) => i1.CompareTo(i2)
                    ));
Run Code Online (Sandbox Code Playgroud)

i1和i2正好相反.

  • 或者只是`Array.Sort(array,(a,b)=> b.CompareTo(a))`用于反向排序. (12认同)
  • 这个,或者只是在`CompareTo`之前添加一个`-`(减号) (10认同)
  • 是的,但有时会慢一些……所以这取决于您想要的内容和排序的内容,请参阅:http://stackoverflow.com/questions/6842090/fastest-way-to-sort-an-array-in-descending-order (2认同)

Ale*_*Aza 12

对于按降序就地排序:

int[] numbers = { 1, 2, 3 };
Array.Sort(numbers, (a, b) => b.CompareTo(a));
Run Code Online (Sandbox Code Playgroud)

对于异地排序(不更改输入数组):

int[] numbers = { 1, 2, 3 };
var sortedNumbers = numbers.OrderByDescending(x => x).ToArray();
Run Code Online (Sandbox Code Playgroud)


Yoc*_*mer 9

当然,您可以自定义排序.

您需要将Sort()作为委托给它将用于排序的比较方法.

使用匿名方法:

Array.Sort<int>( array,
delegate(int a, int b)
  {
    return b - a; //Normal compare is a-b
  }); 
Run Code Online (Sandbox Code Playgroud)

阅读更多相关信息:

排序数组
MSDN - Array.Sort方法(T [],比较)

  • 请记住,当 b 是 int.MinValue 并且 a 是任何正数时,您可能会遇到 b - a 的整数溢出。最好总是执行 b.CompareTo(a) (2认同)