115

可能重复:
任何人都可以向我解释 IEnumerable 和 IEnumerator 吗?

IEnumerator 和 IEnumerable 有什么区别?

4

4 回答 4

124

IEnumerable是一个接口,它定义了一个方法GetEnumerator,它返回一个IEnumerator接口,这反过来又允许对集合进行只读访问。实现 IEnumerable 的集合可以与 foreach 语句一起使用。

定义

IEnumerable 

public IEnumerator GetEnumerator();

IEnumerator

public object Current;
public void Reset();
public bool MoveNext();

来自 codebetter.com 的示例代码

于 2009-03-06T16:52:16.480 回答
74

AnIEnumerator是一个可以枚举的东西:它具有Current属性和MoveNextandReset方法(在 .NET 代码中您可能不会显式调用它们,尽管您可以)。

AnIEnumerable是一个可以枚举的东西......这仅仅意味着它有一个 GetEnumerator 方法,该方法返回一个IEnumerator.

你用哪个?使用的唯一原因IEnumerator是,如果您有某种非标准的枚举方式(即,一个接一个地返回其各种元素),并且您需要定义其工作方式。您将创建一个实现IEnumerator. 但是你仍然需要IEnumeratorIEnumerable课堂上返回它。

要查看枚举器(实现IEnumerator<T>)的样子,请查看任何Enumerator<T>类,例如包含在或List<T>中的类。要查看实现的类,请参阅任何标准集合类。Queue<T>,Stack<T>IEnumerable

于 2009-03-06T17:10:18.387 回答
20

向您显示Enumerator列表或集合中的项目。Enumerator 的每个实例都位于某个位置(第 1 个元素、第 7 个元素等),并且可以为您提供该元素 ( IEnumerator.Current) 或移动到下一个 ( IEnumerator.MoveNext)。当您foreach在 C# 中编写循环时,编译器会生成使用枚举器的代码。

AnEnumerable是一个可以给你Enumerators 的类。它有一个名为的方法GetEnumerator,它为您提供了一个Enumerator查看其项目的方法。当您foreach在 C# 中编写循环时,它生成的代码调用GetEnumerator以创建Enumerator循环使用的循环。

于 2009-03-06T18:00:44.540 回答
12

IEnumerable并且IEnumerator都是接口。IEnumerable只有一种方法称为GetEnumerator. 此方法返回(因为所有方法都返回包括 void 在内的内容)另一种类型,它是一个接口,该接口是IEnumerator. 当您在任何集合类中实现枚举器逻辑时,您就实现IEnumerable了(通用或非通用)。IEnumerable只有一个方法,而IEnumerator有 2 个方法(MoveNextReset)和一个属性Current。为了便于理解,将IEnumerable其视为一个包含IEnumerator在其中的盒子(尽管不是通过继承或包含)。请参阅代码以更好地理解:

class Test : IEnumerable, IEnumerator
{
    IEnumerator IEnumerable.GetEnumerator()
    {
        throw new NotImplementedException();
    }

    public object Current
    {
        get { throw new NotImplementedException(); }
    }

    public bool MoveNext()
    {
        throw new NotImplementedException();
    }

    public void Reset()
    {
        throw new NotImplementedException();
    }
}
于 2009-03-06T16:52:03.377 回答