C# IEnumerable与lt;T>;。反向与反向;列表<;T>;。逆转
为什么C# IEnumerable与lt;T>;。反向与反向;列表<;T>;。逆转,c#,generic-collections,C#,Generic Collections,为什么IEnumerable.Reverse()返回与原始集合一起反转的集合,而List反转原始集合本身?这让我有些困惑,因为List继承自IEnumerableReverse上的IEnumerable是Linq的一部分,是作为扩展方法添加的(Enumerable.Reverse)。它是在为列表执行反向后添加的 IEnumerable也不是对象的集合。它只是告诉消费者如何获得这些商品。因为它们是两种不同的方法 是列表上的实例方法。这将修改现有的列表 是IEnumerable上的扩展方法。这将创建
IEnumerable.Reverse()
返回与原始集合一起反转的集合,而List
反转原始集合本身?这让我有些困惑,因为List
继承自IEnumerable
Reverse
上的IEnumerable
是Linq的一部分,是作为扩展方法添加的(Enumerable.Reverse
)。它是在为列表
执行反向
后添加的
IEnumerable
也不是对象的集合。它只是告诉消费者如何获得这些商品。因为它们是两种不同的方法
是列表
上的实例方法。这将修改现有的列表
是IEnumerable
上的扩展方法。这将创建一个按相反顺序枚举源序列的新序列
通过将调用作为静态方法,可以在列表中使用后者:
var list = new List<string>{"1","2"};
var reversed = Enumerable.Reverse(list)
var list=新列表{“1”、“2”};
var reversed=可枚举。Reverse(列表)
或通过强制转换为IEnumerable
:
IEnumerable list=新列表{“1”,“2”};
var reversed=list.Reverse();
在这两种情况下,列表
保持不变,当枚举返回{“2”,“1”}
时,反转
,记住,这是不同的方法。本质上不同,只有一个名字
void List.Reverse
仅是列表实例的一种方法,它对列表或其一部分进行就地反转
IEnumerable Enumerable.Reverse
是一种扩展方法(顺便说一句,IList也有它!)创建一个顺序颠倒的新的可枚举项。没有IEnumerable.Reverse()
它是可枚举的.Reverse(此IEnumerable)
及其从Linq扩展到所有IEnumerable
的方法
既然我们已经确定了它们的来源,就很容易理解它们为何如此不同。Linq增加了创建“处理流”的方法,它通过每次创建新实例来实现
List.Reverse()
是List
的一种方法,与它的所有方法(例如Add
)一样,直接修改实例。IEnumerable
有一个底层实现,可以是List
、Hashtable
或实现IEnumerable的其他东西
List
本身就是实现,因此您可以直接修改该实例
正如大家所提到的,一个是扩展方法,是Linq的一部分,另一个是直接在类型上实现的。从概念上讲,这可能是因为当您想要表示不可变的项集合时,使用了IEnumerable
。也就是说,您只希望读取列表中的项目,而不希望添加/插入/删除或以其他方式更改集合。在此数据视图中,以不同顺序返回新的IEnumerable
是预期结果。当您使用列表
时,您希望能够添加/插入/删除或以其他方式修改集合,因此在该上下文中需要使用反向
方法来更改原始列表的顺序
正如其他人所指出的,IEnumerable
是一个接口,List
是一个类<代码>列表
实现了IEnumerable
所以
IEnumerable name=new List();
var reversedNames=names.Reverse();
获取第二个列表,反向。
鉴于
List<String> names = new List<String>();
names.Reverse();
列表名称=新列表();
name.Reverse();
反转原始列表。我希望这是有意义的。
IEnumerable
是一个接口,List
不是继承它,而是实现它。这是一个巨大的区别。看起来这个答案是唯一解释原因的答案:“它是在Reverse
为List
实现后添加的。”我添加了一个扩展方法“Reversed”,它只包装了Ienumerable。Reverse-通常你想要不变性,现在,您可以直接调用它,而无需任何铸造或其他样板代码。
IEnumerable<String> names = new List<String>();
var reversedNames = names.Reverse();
List<String> names = new List<String>();
names.Reverse();