爲什麼IEnumerable<T>.Reverse()
返回與原始集合相反的集合和List<T>
反轉原始集合本身?這對我來說有些困惑,因爲List<T>
繼承自IEnumerable<T>
。IEnumerable之間的區別<T>。逆向和列表<T>。逆
回答
從概念上講,這可能是因爲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();
反轉原始的列表。我希望這是有道理的。
Reverse
on IEnumerable<T>
是Linq的一部分,並作爲擴展方法添加(Enumerable.Reverse<T>
)。在Reverse
實施List<T>
後添加。
IEnumerable<T>
也不是對象的集合。它只是告訴消費者如何獲取這些物品。
看起來像這個答案是唯一一個解釋*爲什麼*:*「它被添加了'反向'後實施了'列表
因爲它們是兩種不同的方法。
List<T>.Reverse
是List<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"}
。
我已經添加了擴展方法'Reverse ** d **'這只是包裝Ienumerable.Reverse - 往往你想要不變性,現在你可以在沒有任何鑄造或其他樣板代碼的情況下調用它。 –
這些是不同的方法,請記住。本質上不同,沒有什麼共同之處,只有一個名字。
void List.Reverse
是List實例的一種方法,它可以反轉列表或其中的一部分。
IEnumerable Enumerable.Reverse
是一個擴展方法(btw IList
也有它!)創建一個新的枚舉順序顛倒。
沒有這樣的東西IEnumerable<T>.Reverse()
這是Enumerable.Reverse<T>(this IEnumerable<T>)
它是從Linq的擴展方法適用於所有IEnumerable<>
。
既然我們已經建立起來了,那麼很容易理解他們爲什麼如此不同。 Linq增加了創建「處理流」的方法,並且通過每次創建新實例來實現。
List<T>.Reverse()
是List
的一種方法,就像它所有的方法(例如Add
)直接修改實例一樣。
IEnumerable<T>
有一個潛在的實現,它可能是List<T>
,Hashtable<T>
或其他實現IEnumerable的其他東西。
List<T>
本身是的實現,所以你可以直接修改那個實例。
和其他人一樣,一個是Linq的擴展方法和一部分,一個是直接在類型上實現的。
- 1. 列表<T>和列表<object>之間的區別?
- 2. IEnumerable和IEnumerable之間的區別<T>?
- 3. Rails:<%=和<%==之間的區別?
- 4. <?php和<?之間的區別
- 5. Ruby中+和<<之間的區別
- 6. 列表<Integer>和List <?之間的區別super Integer>
- 7. 列表<string>和IEnumerable <String>有什麼區別?
- 8. IDictionary <,>逆變?
- 9. <%! %>與<% %>之間的區別
- 10. Java泛型:列表<E>和列表<?>之間有區別嗎?
- 11. jsp表達式標記之間的區別<%和<%=
- 12. <%form ..和<%=表格之間的區別
- 13. Prolog中的逆向列表
- 14. 逆向陣列
- 15. <stdafx.h>和「stdafx.h」之間的區別
- 16. python:!=和<>之間的區別?
- 17. <s:Line>和graphics.lineTo()之間的區別
- 18. 類和類之間的區別<?>
- 19. #include <...>和#include「...」之間的區別?
- 20. 部隊更新TGT
- 21. 剃刀視圖之間的區別IEnumerable <Model>與模型?
- 22. 在ASP.NET WebForms中,<%:, <%=和<%#之間有什麼區別?
- 23. 列表<T>與列表之間的區別<? extends T>
- 24. 就是在C#列表<>和詞典<>之間的區別
- 25. `<%#`和`<%=`和一個asp.net ascx文件之間的區別?
- 26. 層之間的逆向依賴問題
- 27. ((IEnumerable)source).OfType <T>()和source爲IEnumerable <T>之間的區別是什麼?
- 28. 新列表<int>(array)和array.ToList()之間有區別嗎?
- 29. WSDL中的<types>和<message>之間的區別
- 30. Java中的類<?>和類<Object>之間的區別
'IEnumerable'是一個接口,'List '不會繼承它,它**實現**它。這是一個巨大的差異。 –
MarcinJuraszek