关于排序扩展的一些误解

时间:2012-12-20 10:05:45

标签: c# .net ienumerable

我有以下代码示例:

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

我得到了想要的结果。

任何想法为什么我没有得到想要的结果使用第一个声明?

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

提前谢谢。

2 个答案:

答案 0 :(得分:6)

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

.OrderByDescending()扩展程序会生成一个新列表(或者更确切地说是IEnumerable<T>)并保留原始list

修改
要获得两个排序顺序的两个列表:

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

答案 1 :(得分: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()

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

一般情况下:如果您想要订购序列,请使用OrderByOrderByDescending;如果您想要反转不一定订单的序列,请使用Reverse(至少令人困惑) )。