2011-03-25 31 views
42

我有一个int数组,我必须按降序排序。按降序排列数组的更好方法

由于我没有找到降序order.Currently我排数组按降序排列如下

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

现在数组进行排序的任何方法,问题是that.Is有没有更好的办法在c#中做同样的事情?

回答

46

根据不同的排序顺序,你可以这样做:

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

...或这个:

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

I1和I2是刚刚相反。

+9

这一点,或者只是添加'-'(减号)之前'CompareTo' – digEmAll 2011-03-25 08:31:11

+0

@digEmAll:绝对;) – JYL 2011-03-25 08:32:08

+10

或简单地'Array.Sort(数组,(a,b)=> b.CompareTo(a))'反向排序。 – 2014-11-06 12:04:30

2

是的,你可以通过谓词进行排序。这将是你的反向实施。

2

您可以指定一个比较器(IComparer实现)作为Array.Sort中的一个参数,排序的顺序实际上取决于比较器。默认比较器用于升序排序

52

使用LINQ OrderByDescending方法。它会返回IOrderedIEnumerable<int>,如果需要,您可以将其转换回数组。一般而言,List<> s功能更强,然后Array s。

array = array.OrderByDescending(c => c).ToArray(); 
+1

你击败了我! :) – 2011-03-25 08:27:13

+5

这是一个简短的工作代码,但如果数组很大,它不是非常有效(在性能方面),因为数组首先被转换为列表,然后被排序,最后转换为数组。我错了吗 ? – JYL 2011-03-25 09:14:42

+0

@Ilyusha,如果从复合对象(不是简单对象)的角度考虑int,那么int就是与其他对象相同的对象,因为你需要比较两个对象中的任何一个,直到第一个差异,所以O(n)是不可能的结果 – 2011-06-29 15:28:32

9

当然,你可以自定义的排序。

您需要将Sort()委托给一个将用于排序的比较方法。

使用匿名方法:

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

了解更多关于它:

Sorting arrays
MSDN - Array.Sort Method (T[], Comparison)

+1

如果发生溢出,将无法正常工作。 – Henrik 2017-02-22 08:23:45