如何排序通用列表DESC和ASC?


110

如何排序通用列表DESC和ASC?使用LINQ和不使用LINQ?我正在使用VS2008。

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

Answers:


245

与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) => b.CompareTo(a)); // descending sort

请注意,没有Linq,列表本身将被排序。使用Linq,您可以获得列表的可枚举枚举,但列表本身并未更改。如果要更改列表,可以将Linq方法更改为

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

1
@onedaywhen如果您认为其他用户的答案不正确,则应在评论,投票和/或提供您认为正确的答案时,不要将其他人的答案编辑为您认为正确的答案。
Servy

24
我认为对于降序而言,使用li.Sort((a, b) => b.CompareTo(a));-1*方法要比此处使用的方法更为清晰。我相应地编辑了答案,但@Servy恢复了它。
一天,2015年

9
@onedaywhen当作者在写出他们想要的内容时犯了一个错误时,将其更改为他们想要写的内容就可以了。从其他人认为解决方案应该更改代码的方式到使用您认为应该使用的其他方法来代替,这不是适当的编辑。
2015年

5
肯定的@oneday 您会在描述编辑的任何地方看到它。在帮助中心中,“我应何时编辑帖子?[...]以阐明帖子的含义(不更改其含义)”
Servy

4
或者只是-a.CompareTo(b)
Shimmy Weitzhandler '17

72

没有Linq:

上升:

li.Sort();

降序:

li.Sort();
li.Reverse();

Sort()是一个空方法,因此您不能Reverse()以这种方式将其链接到它。您将需要2个单独的操作。但是,通过LINQ,您可以将其链接到一个,OrderBy但是此时您应该使用LINQ OrderByDescending
艾哈迈德·玛吉德


3

我正在检查以上所有答案,并希望添加其他信息。我想按DESC顺序对列表进行排序,我正在寻找对于较大输入而言更快的解决方案,并且我之前使用的是这种方法:-

li.Sort();
li.Reverse();

但我的测试用例未能超过时间限制,因此以下解决方案对我有效:

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

因此最终得出的结论是,按降序对列表进行排序的第二种方法比前一种方法快一些。


-3

一种非常简单的以int值降序对List进行排序的方法:

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

希望这会有所帮助!


4
这不是int.CompareTo(int)门的原因。请参阅referencesource.microsoft.com的来源,其中说:“ 需要使用比较,因为对于非常大的负数,减法将换为正数,等等。 ” 如果您有b = int.MinValueand a = 1(say),这将失败。有时,方法调用是值得的。
Wai Ha Lee

问题是关于通用列表排序的。“-”操作甚至不会针对许多类型进行编译。对于已编译的类型集,您可能会有数字溢出错误,如之前的注释中所述
Vadim Levkovsky
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.