我正在努力了解IEnumerable的好处。据我所知,Enumerables允许将执行推迟到以后。
请参阅此处的示例:https://msdn.microsoft.com/en-us/library/system.collections.ienumerable(v=vs.110).aspx。在此示例中,数组已在主类中填充,然后注入IEnumerable类。因此,这似乎消除了延迟执行直到以后的优点。我在这里缺少什么?
答案 0 :(得分:4)
IEnumerable
的主要目的是不将执行推迟到以后。 IEnumerable
的目的是提供迭代对象部分的方法。这些部分可以是列表中的项目,但它们也可以是(例如)string
的字符。存在IEnumerable
接口,因为不是每个允许迭代其部分的类都是集合或列表(例如string
)而IEnumerable
提供了一个最小的接口来实现这一点,而不必实施全面展开ICollection
或IList
。
IEnumerable
的主要和最重要的消费者是foreach
语句,该语句自 time .NET开始以来就存在。后来只有LINQ的Enumerable
类也建立在IEnumerable
(或者更确切地说是IEnumerable<T>
)接口上。
说到LINQ,你在问题中提到的延迟执行确实是LINQ的一个关键特性。这意味着在执行IEnumerable
的迭代之前,不会执行您定义的查询。这允许您在执行查询之前进一步优化查询。
此延迟执行仅涉及如何使用 IEnumerable
,而不是它的作用。延迟执行意味着您在定义它时不会开始迭代IEnumerable
,而是在程序的不同点迭代,例如foreach
,ToList
等。
答案 1 :(得分:2)
您引用的文档仅仅是如何实现,而不是最有效的方式。当然,所显示的实现根本没有用,因为正如你所说的那样,数组已经构建并且可以枚举。
通过实施IEnumerable
,该示例最多可用于展示自定义类型如何像集合一样运行。这个非常通用的界面当然可以用来从你不需要有关集合类型的特定知识的各种地方调用,但样本中没有显示。
枚举器用于从头到尾迭代一组数据。您无法读取之前的项目,因为它已经被丢弃(例如,需要从远程位置下载非常大的文件的迭代器,您可能不想缓存它们)。
答案 2 :(得分:1)
IEnumerable的一个例子是延迟执行。
我认为使用IEnumerable的最大好处是:
您可以在不知道如何迭代它的情况下迭代集合(集合是否有索引器?我应该如何迭代树?等等。)
您可以迭代集合的一部分 - 考虑找到符合您条件的第一个元素。
延迟执行 - 您可以过滤集合,并且只要遍历IEnumerable就会发生真正的过滤(使用ForEach \ ToList等)。
答案 3 :(得分:0)
是否推迟评估是一种设计选择,但IEnumerable并未强制要求。一些Linq输出查询(如Where&amp; Select)推迟评估,其他集合如Dictionary或List则不会。
当集合中需要的唯一信息是能够“枚举”元素时,您应该使用IEnumerable。
假设您要为泛型集合实现ToString方法,其中对象具有自己的ToString。如果接受IEnumerable而不是数组,则可以将List或Set作为参数传递,而不进行任何代码更改。