枚举的好处

Benefit of Enumerables

我很难理解 IEnumerable 的好处。我知道 Enumerables 允许推迟到以后执行。

请在此处查看示例:https://msdn.microsoft.com/en-us/library/system.collections.ienumerable(v=vs.110).aspx。在此示例中,数组已填充到 main class 中,然后注入到 IEnumerable class 中。因此,这似乎消除了将执行推迟到以后的优势。我在这里错过了什么?

您参考的文档只是您如何实现它,而不是最有效的方法。当然,显示的实现根本没有用,因为正如您所说,数组已经构造好并且可以自行枚举。

该示例充其量只是通过实现 IEnumerable 来展示自定义类型如何像集合一样工作。这个非常通用的接口当然可以用于从不需要有关集合类型的特定知识的各种地方调用,但示例中没有显示。

枚举器用于从头到尾遍历一组数据。您无法读回前一项,因为它可能已经被丢弃(例如,需要从远程位置下载非常大的文件的迭代器,您可能不想缓存它们)。

是否延迟计算是一种设计选择,但 IEnumerable 并未强制要求。一些 Linq 输出查询(如 Where & Select)延迟评估,其他集合如 Dictionary 或 List 则不会。

当您从集合中需要的唯一信息是能够 'enumerate' 元素时,您应该使用 IEnumerable。

假设您要为泛型集合实现 ToString 方法,其中对象有自己的 ToString。如果您接受 IEnumerable 而不是数组,则可以将 List 或 Set 作为参数传递,而无需更改任何代码。

IEnumerable 的主要目的是而不是 推迟执行。 IEnumerable 的目的是提供一种遍历对象各部分的方法。这些部分可以是列表的项目,但它们也可以是(例如)string 的字符。 IEnumerable 接口的存在是因为并非每个允许迭代其部分的 class 都是集合或列表(例如 string)并且 IEnumerable 提供了一个最小的接口来实现这无需实施完整的 ICollectionIList.

IEnumerable 的主要和最重要的使用者是 foreach 语句,它从 time.NET 开始就存在。只是后来才出现了带有 Enumerable class 的 LINQ,它也建立在 IEnumerable(或更准确地说是 IEnumerable<T>)接口上。

说到 LINQ,您在问题中提到的延迟执行确实是 LINQ 的一个关键特性。这意味着在执行 IEnumerable 的迭代之前不会执行您定义的查询。这使您可以在执行查询之前进一步细化查询。

这个延迟执行只是指如何使用IEnumerable,而不是什么它确实。延迟执行意味着您不会在定义 IEnumerable 时开始迭代它,而是在程序的不同点开始迭代,例如 foreachToList

IEnumerable 的一个例子是延迟执行。

我认为使用 IEnumerable 的最大优势是:

  1. 不知道怎么迭代就可以迭代集合(集合有索引器吗?树怎么迭代?等等)

  2. 您可以迭代集合的一部分 - 考虑找到满足您条件的第一个元素。

  3. 延迟执行 - 您可以过滤集合,真正的过滤将在您遍历 IEnumerable 时立即发生(使用 ForEach\ToList 等)。