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();