为什么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