0

我有以下代码示例:

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

我得到了想要的结果。

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

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

先感谢您。

4

2 回答 2

6

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

.OrderByDescending()扩展方法会生成一个新列表(或者更确切地说是一个)IEnumerable<T>并保持原始列表list不变。

编辑
要获得两个列表,对于两个排序顺序:

List<int> upList = list.OrderBy(n => n).ToList();
List<int> downList = list.OrderByDescending(n => n).ToList();
于 2012-12-20T10:11:04.270 回答
2

编辑:所以问题似乎是你认为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()

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

一般来说:使用OrderByorOrderByDescending如果你想订购一个序列,Reverse如果你想反转序列,那不一定是一个顺序(至少是令人困惑的)。

于 2012-12-20T10:10:59.217 回答