2015-05-15 41 views

回答

6

從概念上講,這可能是因爲IEnumerable用於表示不可變的項目集合時。也就是說,您只想讀取列表中的項目,但不要添加/插入/刪除或以其他方式更改集合。在這個數據視圖中,以不同的順序返回新的IEnumerable是預期的結果。當您使用List時,您希望能夠添加/插入/刪除或以其他方式更改集合,因此在該上下文中預期會更改原始列表的順序。

正如其他人所指出的IEnumerable是一個接口和List是一類。 List implements IEnumerable

所以,

IEnumerable<String> names = new List<String>(); 
var reversedNames = names.Reverse(); 

讓你的第二列表,顛倒。 然而,

List<String> names = new List<String>(); 
names.Reverse(); 

反轉原始的列表。我希望這是有道理的。

3

Reverse on IEnumerable<T>是Linq的一部分,並作爲擴展方法添加(Enumerable.Reverse<T>)。在Reverse實施List<T>後添加。

IEnumerable<T>也不是對象的集合。它只是告訴消費者如何獲取這些物品。

+0

看起來像這個答案是唯一一個解釋*爲什麼*:*「它被添加了'反向'後實施了'列表'」* –

7

因爲它們是兩種不同的方法。

List<T>.ReverseList<T>上的實例方法。這將修改列表。

Enumerable.Reverse<T>IEnumerable<T>上的擴展方法。這會創建一個按相反順序枚舉源序列的新序列。

你可以調用的靜態方法使用上一個List<T>後者:

var list = new List<string>{"1","2"}; 
var reversed = Enumerable.Reverse(list) 

或者通過轉換成IEnumerable<T>

IEnumerable<string> list = new List<string>{"1","2"}; 
var reversed = list.Reverse(); 

在這兩種情況下,list保持不變,並且reversed時枚舉返回{"2","1"}

+0

我已經添加了擴展方法'Reverse ** d **'這只是包裝Ienumerable.Reverse - 往往你想要不變性,現在你可以在沒有任何鑄造或其他樣板代碼的情況下調用它。 –

0

這些是不同的方法,請記住。本質上不同,沒有什麼共同之處,只有一個名字。

void List.Reverse是List實例的一種方法,它可以反轉列表或其中的一部分。

IEnumerable Enumerable.Reverse是一個擴展方法(btw IList也有它!)創建一個新的枚舉順序顛倒。

0

沒有這樣的東西IEnumerable<T>.Reverse()這是Enumerable.Reverse<T>(this IEnumerable<T>)它是從Linq的擴展方法適用於所有IEnumerable<>

既然我們已經建立起來了,那麼很容易理解他們爲什麼如此不同。 Linq增加了創建「處理流」的方法,並且通過每次創建新實例來實現。

List<T>.Reverse()List的一種方法,就像它所有的方法(例如Add)直接修改實例一樣。

0

IEnumerable<T>有一個潛在的實現,它可能是List<T>,Hashtable<T>或其他實現IEnumerable的其他東西。

List<T>本身的實現,所以你可以直接修改那個實例。

和其他人一樣,一個是Linq的擴展方法和一部分,一個是直接在類型上實現的。

相關問題