关于排序扩展的一些误解
本文关键字:误解 扩展 于排序 排序 | 更新日期: 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的顺序。如果您以有序的方式添加它们,则根本不需要订购。
一般来说:如果你想排序一个序列,使用OrderBy
或OrderByDescending
;如果你想反转一个不一定是顺序的序列,使用Reverse
。