实现IEnumerable和IEnumerator的原因是什么

时间:2014-07-22 15:33:33

标签: c#

我正在为我的C#EXAM做准备。 我对这个问题的答案感到困惑:

  

程序可以使用IEnumerableIEnumerator接口来执行以下哪项操作?

     

一个。使用MoveNext和Reset来移动对象列表   湾使用foreach移动对象列表。
  C。按索引移动对象列表   d。使用yield return语句来创建迭代对象列表。

我的回答是 b )。但是这本书: MCSD Certification Toolkit 表示它是 a )。

有人可以告诉我为什么吗?我意识到您可以使用Enumerator获取GetEnumerator(),然后调用MoveNextReset方法在列表中移动(并使用Current访问迭代器引用的当前元素)。但是没有实现IEnumerableIEnumeratorforeach循环中使用对象的原因吗?

3 个答案:

答案 0 :(得分:4)

正确的答案是 a ,如果您查看接口的定义,这一点很清楚:

[GuidAttribute("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
[ComVisibleAttribute(true)]
public interface IEnumerable
{
    IEnumerator GetEnumerator();
}

并且

[ComVisibleAttribute(true)]
[GuidAttribute("496B0ABF-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerator
{
    Object Current { get; }
    bool MoveNext();
    void Reset();
}

正如您在此处注意到的,当一个类型实现IEnumerable接口时,它应该有一个返回Enumerator的方法,Enumerator是一个实现IEnumerator接口的对象。

当我们遍历集合和两个方法IEnumeratorMoveNext时,名为Reset的接口有一个属性来保存当前对象。在引擎盖下,当我们遍历集合时,首先调用Iterator的方法MoveNext。如果这是真的,我们得到第一个元素 - 那是当前对象。然后一次又一次地调用名为MoveNext的方法,直到它返回false。每次调用MoveNext时,我们都会从集合中获取一个对象,我们会遍历。

为什么我们使用Reset方法?

正如MSDN中所述:

  

将枚举数设置为其初始位置,该位置位于第一个位置之前   集合中的元素。

答案 1 :(得分:1)

当您实施界面时,您同意合同:MoveNext和Reset。问题的其他选项是指实现接口的具体类。

答案 2 :(得分:0)

如果MoveNext传递集合的末尾,则枚举数位于集合中的最后一个元素之后,MoveNext返回false。当枚举数位于此位置时,后续对MoveNext的调用也返回false。如果最后一次调用MoveNext返回false,则Current未定义。要再次将Current设置为集合的第一个元素,可以调用Reset,然后调用MoveNext。

click here for detailed explanation