IEnumerable & IEnumerator

6

请问有人能够解释一下IEnumerable和IEnumerator的区别,以及如何使用它们吗?

谢谢!!!


在哪种编程语言/平台上? - H H
那将是.NET - 已重新标记。 - David M
6个回答

11

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

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

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

如果mylist是一个完美实现的IEnumerable,那么这将很好地工作,但如果mylist返回自身作为枚举器,则会失败。


我认为一个IEnumerator的示例实现会对OP有所帮助,一旦你看到它们如何配合,就会清晰得多。 - Tigraine

10

IEnumerable 接口定义了一个可以被枚举的类,也就是说它包含可以通过枚举来访问的元素。

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

区别在于,IEnumerable 表示 "你可以枚举我",而 IEnumerator 则执行枚举任务。

更详细来说,IEnumerable 公开了一个名为 GetEnumerator 的方法。该方法返回一个 IEnumerator 实例,您可以使用它来进行枚举。通常情况下,您不需要直接调用这个方法,因为 foreach 关键字会自动处理它。

foreach(int element in myList)
{
    // Do some work...
}

这段代码实际上会被编译器扩展为:

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来枚举元素。


3

IEnumerable是可以枚举的对象,而IEnumerator则是进行枚举的手段。因此,IEnumerable仅定义了一个方法-GetEnumerator,该方法返回一个IEnumerator实例以执行实际的工作...


2

IEnumerable 定义了一个包含对象集合的对象,可以进行枚举。

IEnumerator 是允许对集合进行枚举的对象,并存储枚举状态。


0

IEnumerable 意味着可以枚举的东西,IEnumerator 是用来枚举它的。

简化为一个简单的 for 循环:

for (int i=0; i<10;i++)
{
   count+=myarray[i];
}

在上面的例子中,i将是IEnumerator,而myarray将是IEnumerable。

这不正确 - i只是一个“int”,它没有实现“IEnumerator”。 - EMP

0

IEnumerable和IEnumerator之间的区别。

  1. IEnumerable在内部使用IEnumerator。
  2. IEnumerable不知道正在执行的是哪个项/对象。
  3. IEnumerator知道当前项/对象的位置。
  4. IEnumerable不知道当前项/对象的位置。
  5. IEnumerable有一个方法,GetEnumerator()

获取代码-IEnumerable & IEnumerator

public class Program {  
    public static void Main(string[] args) {  
        IEnumerable_Example();  
    }  
    static void IEnumerable_Example() {  
        List < string > Month = new List < string > ();  
        Month.Add("January");  
        Month.Add("February");  
        Month.Add("March");  
        Month.Add("April");  
        Month.Add("May");  
        Month.Add("June");  
        Month.Add("July");  
        Month.Add("August");  
        Month.Add("September");  
        Month.Add("October");  
        Month.Add("November");  
        Month.Add("December");  
        IEnumerable < string > IEnumerable_ = (IEnumerable < string > ) Month;  
        Console.WriteLine("IEnumerable_Example() Executing");  
        Console.WriteLine("------------IEnumerable Returning items using foreach----------------");  
        foreach(string i in IEnumerable_) {  
            Console.WriteLine(i);  
        }  
        IEnumerator_Example(IEnumerable_);  
    }  
    static public void IEnumerator_Example(IEnumerable enumerable) {  
        IEnumerator enumerator = enumerable.GetEnumerator();  
        Console.WriteLine("----------IEnumerator_Example() Executing------------");  
        while (enumerator.MoveNext()) {  
            Console.WriteLine("----" + enumerator.Current.ToString() + "----");  
        }  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接