IEnumerator 和 IEnumable 之间的区别是什么?

177561 次浏览

IEnumerableIEnumerator都是接口。IEnumerable只有一个称为 GetEnumerator的方法。此方法返回(因为所有方法都返回包含 void 的内容)另一种类型,即接口,该接口为 IEnumerator。在任何集合类中实现枚举器逻辑时,实现 IEnumerable(泛型或非泛型)。IEnumerable只有一个方法,而 IEnumerator有2个方法(MoveNextReset)和一个属性 IEnumerator0。为了便于理解,请将 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();
}
}

IEnumable 是一个接口,它定义了一个返回 IEnumerator < a href = “ http://msdn.microsoft.com/en-us/library/system.Collections.IEnumerator.aspx”rel = “ noReferrer”> IEnumerator 接口的方法 GetEnumerator,这反过来又允许只读访问集合。实现 IEnumable 的集合可以与 foreach 语句一起使用。

定义

IEnumerable


public IEnumerator GetEnumerator();


IEnumerator


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

来自 codebetter.com 的示例代码

An IEnumerator is a thing that can enumerate: it has the Current property and the MoveNext and Reset methods (which in .NET code you probably won't call explicitly, though you could).

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

你用哪个?使用 IEnumerator的唯一原因是,如果您有一种非标准的枚举方法(即逐个返回其各种元素) ,并且您需要定义它是如何工作的。您将创建一个实现 IEnumerator的新类。但是您仍然需要在 IEnumerable类中返回该 IEnumerator

要了解枚举器(实现 IEnumerator<T>)的外观,请参见任何 Enumerator<T>类,例如包含在 List<T>Queue<T>,Stack<T>中的类。有关实现 IEnumerable的类的信息,请参见任何标准集合类。

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

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