首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IEnumerable和IEnumerator

IEnumerable和IEnumerator
EN

Stack Overflow用户
提问于 2010-04-14 16:11:12
回答 6查看 772关注 0票数 6

谁能给我解释一下IEnumerable和IEnumerator之间的区别,以及如何使用它们?

谢谢!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-04-14 16:13:42

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

它们不是一个且相同的原因是,即使在单线程应用程序中,您也可以在同一时间对同一对象进行多个枚举。例如,考虑以下代码:

代码语言:javascript
复制
foreach (x in mylist)
{
    foreach (y in mylist)
    {
        if (x.Value == y.Value && x != y)
        {
            // Found a duplicate value
        }
    }
}

如果mylistIEnumerable的适当实现,这将很好地工作,但如果mylist将自身作为枚举器返回,则此方法将失败。

票数 11
EN

Stack Overflow用户

发布于 2010-04-14 16:27:16

IEnumerable接口定义了一个可以枚举的类,即它包含可以通过枚举访问的元素。

IEnumerator接口定义了一个可以对一系列元素执行枚举的类。

区别在于IEnumerable的意思是“您可以枚举我”,而IEnumerator执行枚举任务。

更详细地说,IEnumerable公开了一个方法GetEnumerator。此方法返回一个IEnumerator,然后您可以使用该use执行枚举。通常,您不需要自己处理这个方法,因为foreach关键字会为您处理它。

代码语言:javascript
复制
foreach(int element in myList)
{
    // Do some work...
}

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

代码语言:javascript
复制
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();
}

如您所见,这里使用了一个IEnumerator来执行元素的枚举。

票数 10
EN

Stack Overflow用户

发布于 2010-04-14 16:14:56

IEnumerable是可以枚举的东西。IEnumerator是执行该枚举的方法。所以IEnumerable只定义了一个方法-- GetEnumerator,它返回IEnumerator的一个实例来做实际的跑腿工作……

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2635818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档