2010-06-17 58 views
66

如何对通用列表DESC和ASC进行排序?用LINQ和没有LINQ?我正在使用VS2008。如何对泛型列表DESC和ASC进行排序?

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<int> li = new List<int>(); 

     li.Add(456); 
     li.Add(123); 
     li.Add(12345667); 
     li.Add(0); 
     li.Add(1); 

     li.Sort(); 

     foreach (int item in li) 
     { 
      Console.WriteLine(item.ToString() + "\n"); 
     } 

     Console.ReadKey(); 
    } 
} 

回答

158

使用LINQ

var ascendingOrder = li.OrderBy(i => i); 
var descendingOrder = li.OrderByDescending(i => i); 

没有LINQ的

li.Sort((a, b) => a.CompareTo(b)); // ascending sort 
li.Sort((a, b) => -1* a.CompareTo(b)); // descending sort 

注意,如果没有LINQ中,该列表本身进行排序。使用Linq,你会得到一个有序的列表枚举,但列表本身并没有改变。如果你想发生变异的名单,你会改变LINQ的方法类似

li = li.OrderBy(i => i).ToList(); 
+1

@onedaywhen如果你觉得另一个用户的回答不正确,你应该评论,投票,和/或提供你认为是正确的答案,而不是编辑他人的答案,以使你认为正确。 – Servy 2015-02-24 20:18:15

+12

我认为对于降序,使用'li.Sort((a,b)=> b.CompareTo(a));'比这里使用的'-1 *'方法更清晰。我相应地编辑了答案,但@Servy恢复了它。 – onedaywhen 2015-03-06 15:55:43

+0

@Servy:我认为答案在本质上是正确的,但在一个案例中使用了一些有点奇怪的逻辑。 [编辑常见问题](http://stackoverflow.com/help/privileges/edit)说:“编辑[包括] ...以纠正小错误的一些常见原因。”因此,鼓励(根据您的建议,不要禁止“编辑另一个人的答案以成为您认为正确的答案”)。 – onedaywhen 2015-03-06 16:02:10

13

与出LINQ, 使用Sort()然后Reverse()它。

48

没有LINQ的:

升序:

li.Sort(); 

降序:

li.Sort(); 
li.Reverse(); 
+0

'Sort()'是一个void方法,所以你不能以这种方式链接'Reverse()'。你需要2个独立的操作。但是,对于LINQ,您可以将它链接到'OrderBy',但此时应该使用'OrderByDescending'。 – 2010-06-17 14:33:14

+0

@Ahmad Mageed。当然......下午晚些时候崩溃...... :( – 2010-06-17 14:34:32

+0

这很简单,适用于我和我现有的排序代码 – 2013-08-19 10:45:54

-1

很简单的方式按降序排序为int值列表:

li.Sort((a,b)=> b-a); 

希望这个帮助!

+3

这不是'int.CompareTo(int)'确实是一个原因,请参阅源代码在referencesource.microsoft.com](http://referencesource.microsoft.com/#mscorlib/system/int32.cs,225942ed7b7a3252),其中说:“*需要使用比较,因为减法将包裹为正非常大的负数, *“。如果你有'b = int.MinValue'和'a = 1'(说),这将失败。有时候一个方法调用是值得的。 – 2015-12-12 21:56:12

+0

*由于某种原因... – 2015-12-12 22:20:45

+0

有关通用列表排序的问题。 “ - ”操作甚至不会为许多类型编译。对于已编译的类型集,您可以在之前的注释中提到数字溢出错误 – 2017-08-11 09:36:11

相关问题