2015-05-15 40 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的扩展方法和一部分,一个是直接在类型上实现的。

相关问题