那么列表的发明使IEnumerable类无用而且浪费时间?

时间:2015-04-16 13:04:05

标签: c# list ienumerable

因此,通过引入列表,我们可以轻松地完成,我们曾经使用IEnumerable类。所以现在IEnumerable类主要用于了解列表内部的工作方式。我是对的吗?

2 个答案:

答案 0 :(得分:3)

没有。虽然列表是可枚举的,但反之则并非如此。

IEnumerable作为一个接口声明你可以迭代一系列元素,而IList表示元素的顺序被保留,你可以[以高效的方式 - 在.NET中]随机访问它们。虽然这两者都围绕着一个集合数据结构,但是接口所做的承诺是不同的。也就是说,许多类型都提供这两种类型,因此实现了两个接口(List<T>T[],...)。

考虑数据读取器或计算一系列值(斐波那契,素数,......),集合或树的函数。没有列表,但您可以使用IEnumerable而不是IList作为参数的方法迭代它们。

尽管没有严格匹配标签,但值得一提的是 Java 中的界面语义略有不同。 List interface未指定随机访问。 Iterable interface虽然是IEnumerable的对应物,但却类似。

答案 1 :(得分:1)

我建议使用IEnumerableICollectionIList这样的界面(通用和非通用形式,ICollectionICollection<T>关系不大通过代码来最好地考虑对象可以允许自己使用的方式,这些代码用于对项目序列(可以通过索引计数或寻址)进行各种操作。只想创建一个可通过索引寻址的计数的有序项目序列的代码可以简单地使用List<T>,并且可以使用该类型,无论它是否需要通过索引计数和寻址的东西,但是需要的对象通过代码来使自己可用,期望一系列项目可以直接实现上述接口之一,而不是每次有人想要枚举它们时都必须将其内容复制到新的List<T>

请注意IEnumerable<T>的一个主要优点是实现它的类型不必保存&#34;整个内容&#34;在内存中,可以反而生成元素&#34;在飞行中&#34;。如果有一个方法对IEnumerable<T>中的所有项执行某些操作,并且想要对1,000,000项列表中Fnord大于23的每个项执行该操作(这是真的) 95%的项目),方法接受IEnumerable<T>将无需创建包含Fnord大于23的所有项目的950,000项目列表。