关于排序扩展的一些误解

本文关键字:误解 扩展 于排序 排序 | 更新日期: 2023-09-27 17:49:01

我有以下代码示例:

    List<int> list = new List<int>();
    list.Add(1);
    list.Add(2);
    list.Add(3);
    list.Add(4);
    list.Add(5);
    list.Add(6);
    list.Add(7);
  list.OrderByDescending(n=>n).Reverse();

但是当我使用这个:

list.OrderByDescending(n=>n).Reverse();

我没有得到想要的结果。

如果不使用上面的语句,我使用下面的语句:

list.Reverse();

我得到了想要的结果。

知道为什么我没有得到想要的结果使用第一个语句吗?

我相信我在理解扩展时遗漏了一些东西。

提前感谢。

关于排序扩展的一些误解

list.Reverse()方法就地反转列表,因此您的原始list被更改。

.OrderByDescending()扩展方法产生一个新的列表(或者更确切地说是IEnumerable<T>),并保留原始的list完整。

编辑
为两个排序顺序获得两个列表:

List<int> upList = list.OrderBy(n => n).ToList();
List<int> downList = list.OrderByDescending(n => n).ToList();

Edit:所以问题似乎是你认为Enumerable扩展会改变原始集合。不,他们没有。实际上它们会返回一些新的东西你需要赋值给一个变量:

IEnumerable<int> ordered = list.OrderByDescending(n => n);
foreach(int i in ordered)
    Console.WriteLine(i);

OrderByDescending按降序排列(最高优先),这显然是您想要的。所以我不明白你为什么要在事后倒过来。

所以这应该会给你预期的结果:

var ordered = list.OrderByDescending(n=> n);

返回一个"任意"顺序:

list.Reverse()

,因为它只是颠倒了您添加int s的顺序。如果您以有序的方式添加它们,则根本不需要订购。

一般来说:如果你想排序一个序列,使用OrderByOrderByDescending;如果你想反转一个不一定是顺序的序列,使用Reverse