IEnumerable和IEnumerator

Zab*_*abo 6 .net interface

任何人都可以向我解释IEnumerable和IEnumerator之间有什么区别,以及如何使用它们?

谢谢!!!

EMP*_*EMP 11

通常,a IEnumerable是可以枚举的对象,例如列表或数组.An IEnumerator是存储枚举状态的对象.

它们不是同一个的原因是你可以同时在同一个对象上有多个枚举 - 即使在单线程应用程序中也是如此.例如,请考虑以下代码:

foreach (x in mylist)
{
    foreach (y in mylist)
    {
        if (x.Value == y.Value && x != y)
        {
            // Found a duplicate value
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果mylist是正确的实现,这将工作正常IEnumerable,但如果mylist作为枚举器返回它将失败.


Pau*_*ner 10

IEnumerable接口定义了可在被枚举,即,其包含能够通过枚举被访问元素的类.

IEnumerator接口定义了可以在元素的序列执行枚举的类.

区别在于IEnumerable"你可以枚举我",IEnumerator执行枚举任务.

为了详细说明,IEnumerable公开了一种方法GetEnumerator.此方法返回一个IEnumerator您可以用来执行枚举的方法.通常,您自己不会处理此方法,因为foreach关键字会为您处理.

foreach(int element in myList)
{
    // Do some work...
}
Run Code Online (Sandbox Code Playgroud)

这段代码实际上是由编译器为您扩展的:

IEnumerator enumerator = myList.GetEnumerator();
try 
{
   while (enumerator.MoveNext()) 
   {
      int element = (int)enumerator.Current;
      // Do some work...
   }
}
finally 
{
   IDisposable disposable = enumerator as System.IDisposable;
   if (disposable != null) disposable.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

如您所见,IEnumerator此处使用an 来执行元素的枚举.