2012-12-20 56 views
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(); 

我得到想要的結果。

任何想法,爲什麼我不使用第一條語句得到想要的結果?

我相信我在理解擴展時缺少一些東西。

預先感謝您。

+2

你期待什麼結果呢? '1..7'還是'7..1'?如果答案是「所有數字從七到一」,那麼就使用list.OrderByDescending(a => a); –

+1

你應該寫一個。)你期望的和b。)你得到的。 – looper

+0

如果原始列表看起來像這樣1 ... 7 我希望結果像這樣7 ...1 – Michael

回答

2

編輯:所以問題似乎是,你認爲Enumerable擴展將改變原始集合。不,他們不。其實他們返回你需要ASIGN一個變量一些新的東西:

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如果你想顛倒順序是什麼不一定訂單(這是至少混淆)。

6

list.Reverse()方法在原地顛倒了列表,所以原來的list被更改了。

.OrderByDescending()擴展方法會產生一個新列表(或更確切地說是一個IEnumerable<T>),並保留原始list完整。

編輯
要獲得兩個列表,對於排序順序:

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

+! - 我錯過了就地/新列表方面! –

+0

我需要列表。第一個按降序排列,第二個是OrderByIncreasing(具有相同的值,這就是爲什麼我使用反向) – Michael