.NET 3.5职位的面试问题是“迭代器和枚举器有什么不同”?
这是LINQ的核心区别,等等。
不管怎么说,有什么区别呢?我似乎在网上找不到一个可靠的定义。毫无疑问,我可以找到这两个术语的意思,但我得到的答案略有不同。面试的最佳答案是什么?
IMO迭代器对集合进行“迭代”,枚举器提供迭代的功能,但这必须被调用。
此外,使用yield关键字也可以保存状态。这种状态到底是什么?有没有这种好处的例子?
发布于 2009-04-04 01:16:45
迭代意味着重复某些步骤,而枚举意味着遍历一个值集合中的所有值。所以枚举通常需要某种形式的迭代。
在这种情况下,枚举是迭代的一种特殊情况,步骤是从集合中获取一个值。
注意:“通常”-枚举也可以递归执行,但是递归和迭代是如此紧密相关,所以我不会关心这个微小的差异。
也可以枚举未显式存储在集合中的值。例如,您可以枚举自然数、素数或其他任何值,但您将在枚举过程中计算这些值,而不是从物理集合中检索它们。您可以将这种情况理解为枚举具有由某些逻辑定义的值的虚拟集合。
我想里德·科普西已经说对了。在C#中,有两种主要的枚举方法。
Enumerable语句实现Enumerable和一个实现yield迭代器的类
第一种方法实现起来比较困难,它使用对象进行枚举。第二种方法更容易实现并使用延续。
发布于 2009-04-04 01:18:23
在C# 2+中,iterators是编译器自动生成IEnumerable和/或IEnumerable接口的一种方式。
如果没有迭代器,您将需要创建一个实现IEnumerator的类,包括Current、MoveNext和Reset。这需要做大量的工作。通常,您将为您的类型创建一个实现IEnumerator的私有类,然后yourClass.GetEnumerator()将构造该私有类并返回它。
迭代器是一种让编译器使用简单的语法自动为您生成代码的方法(yield)。这使您可以直接在类中实现GetEnumerator(),而无需指定第二个类( IEnumerator)。这个类及其所有成员的构造已经为您完成了。
迭代器对开发人员非常友好--以一种非常有效的方式完成任务,所需的工作量要少得多。
当您使用foreach时,两者的行为是相同的(前提是您正确地编写了自定义IEnumerator )。迭代器只会让生活变得更简单。
发布于 2009-10-27 19:50:48
C#所称的迭代器通常(在C#之外)称为或生成器函数(例如,在Python语言中)。生成器函数是的特殊情况。C#迭代器(生成器)是枚举器(实现IEnumerable接口的数据类型)的一种特殊形式。
我不喜欢将术语迭代器用于C#生成器,因为它既是一个迭代器,也是一个枚举器。不过,微软改变主意已经太晚了。
相比之下,考虑一下在C++中迭代器是一个值,它主要用于访问集合中的顺序元素。它可以前进、去引用以检索一个值,并进行测试以查看是否已到达集合的末尾。
https://stackoverflow.com/questions/716238
复制相似问题