C# 所以列表的发明使得IEnumerable类变得无用和浪费时间?

C# 所以列表的发明使得IEnumerable类变得无用和浪费时间?,c#,list,ienumerable,C#,List,Ienumerable,因此,通过引入列表,我们可以很容易地做到,就像我们以前对IEnumerable类所做的那样。所以现在IEnumerable类主要用于理解列表的内部工作方式。我说得对吗?不。虽然列表是可枚举的,但反过来就不太正确了 作为一个接口,您可以迭代一系列元素,而声明元素的顺序保持不变,并且您可以[以有效的方式-在.NET中]随机访问它们。尽管这两个接口都围绕着一个数据结构,但接口做出的承诺是不同的。也就是说,许多类型同时提供这两种接口,并因此实现这两种接口(List,T[],…) 例如,想象一个数据读取器

因此,通过引入列表,我们可以很容易地做到,就像我们以前对IEnumerable类所做的那样。所以现在IEnumerable类主要用于理解列表的内部工作方式。我说得对吗?

不。虽然列表是可枚举的,但反过来就不太正确了

作为一个接口,您可以迭代一系列元素,而声明元素的顺序保持不变,并且您可以[以有效的方式-在.NET中]随机访问它们。尽管这两个接口都围绕着一个数据结构,但接口做出的承诺是不同的。也就是说,许多类型同时提供这两种接口,并因此实现这两种接口(
List
T[]
,…)

例如,想象一个数据读取器或一个计算一系列值(斐波那契、素数等)、集合或树的函数。这些列表都不存在,但是您可以使用一个将
IEnumerable
而不是and
IList
作为参数的方法对它们进行迭代


尽管没有严格匹配标记,但值得一提的是,Java中的接口语义略有不同。未指定随机访问。与
IEnumerable
相对应的虽然也很相似。

我建议像
IEnumerable
ICollection
IList
这样的接口(在泛型和非泛型形式中,尽管
ICollection
ICollection
之间几乎没有关系)是对象允许自己被代码使用的最佳方式,该代码设计用于对项目序列(可以是可计数的或可通过索引寻址的)执行各种操作。只想创建可通过索引寻址的计数有序项目序列的代码可以简单地使用列表,并且无论是否需要可通过索引计数和寻址的内容,都可以使用该类型,但是,如果一个对象希望通过一系列项目的代码使其自身可用,那么它可以直接实现上述接口之一,而不必每次有人想枚举它们时都将其内容复制到一个新的
列表中


请注意,
IEnumerable
的一个主要优点是,实现它的类型不必在内存中保存“全部内容”,而是可以“动态”生成元素。如果有一个方法可以处理
IEnumerable
中的所有项目,并且希望对
Fnord
大于23的1000000项目列表中的每个项目执行该操作(95%的项目都是如此),让方法accept
IEnumerable
将避免创建包含
Fnord
大于23的所有项的950000项列表。

据我所知,
IEnumerable
可以看作是
列表的抽象;然而,我不理解将
IEnumerable
视为
List
的前身的观点。你的问题毫无意义
IEnumerable
是一个接口,
List
是一个类。去读吧。游泳池的发明并没有使花园里的水管变得无用和浪费时间。它们有不同的用途。