首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迭代器和枚举器之间的区别

迭代器和枚举器之间的区别
EN

Stack Overflow用户
提问于 2009-04-04 01:09:33
回答 9查看 41.3K关注 0票数 80

.NET 3.5职位的面试问题是“迭代器和枚举器有什么不同”?

这是LINQ的核心区别,等等。

不管怎么说,有什么区别呢?我似乎在网上找不到一个可靠的定义。毫无疑问,我可以找到这两个术语的意思,但我得到的答案略有不同。面试的最佳答案是什么?

IMO迭代器对集合进行“迭代”,枚举器提供迭代的功能,但这必须被调用。

此外,使用yield关键字也可以保存状态。这种状态到底是什么?有没有这种好处的例子?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-04-04 01:16:45

迭代意味着重复某些步骤,而枚举意味着遍历一个值集合中的所有值。所以枚举通常需要某种形式的迭代。

在这种情况下,枚举是迭代的一种特殊情况,步骤是从集合中获取一个值。

注意:“通常”-枚举也可以递归执行,但是递归和迭代是如此紧密相关,所以我不会关心这个微小的差异。

也可以枚举未显式存储在集合中的值。例如,您可以枚举自然数、素数或其他任何值,但您将在枚举过程中计算这些值,而不是从物理集合中检索它们。您可以将这种情况理解为枚举具有由某些逻辑定义的值的虚拟集合。

我想里德·科普西已经说对了。在C#中,有两种主要的枚举方法。

  1. 使用Enumerable语句

实现Enumerable和一个实现yield迭代器的类

第一种方法实现起来比较困难,它使用对象进行枚举。第二种方法更容易实现并使用延续。

票数 61
EN

Stack Overflow用户

发布于 2009-04-04 01:18:23

在C# 2+中,iterators是编译器自动生成IEnumerable和/或IEnumerable接口的一种方式。

如果没有迭代器,您将需要创建一个实现IEnumerator的类,包括Current、MoveNext和Reset。这需要做大量的工作。通常,您将为您的类型创建一个实现IEnumerator的私有类,然后yourClass.GetEnumerator()将构造该私有类并返回它。

迭代器是一种让编译器使用简单的语法自动为您生成代码的方法(yield)。这使您可以直接在类中实现GetEnumerator(),而无需指定第二个类( IEnumerator)。这个类及其所有成员的构造已经为您完成了。

迭代器对开发人员非常友好--以一种非常有效的方式完成任务,所需的工作量要少得多。

当您使用foreach时,两者的行为是相同的(前提是您正确地编写了自定义IEnumerator )。迭代器只会让生活变得更简单。

票数 47
EN

Stack Overflow用户

发布于 2009-10-27 19:50:48

C#所称的迭代器通常(在C#之外)称为或生成器函数(例如,在Python语言中)。生成器函数是的特殊情况。C#迭代器(生成器)是枚举器(实现IEnumerable接口的数据类型)的一种特殊形式。

我不喜欢将术语迭代器用于C#生成器,因为它既是一个迭代器,也是一个枚举器。不过,微软改变主意已经太晚了。

相比之下,考虑一下在C++中迭代器是一个值,它主要用于访问集合中的顺序元素。它可以前进、去引用以检索一个值,并进行测试以查看是否已到达集合的末尾。

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/716238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档