IEnumerable& IEnumerator的

时间:2010-04-14 08:11:12

标签: .net interface

任何人都可以向我解释一下IEnumerable&的区别是什么? IEnumerator, 以及如何使用它们?

感谢!!!

6 个答案:

答案 0 :(得分:11)

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

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

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

如果mylistIEnumerable的正确实现,这将正常工作,但如果mylist将自己作为枚举器返回,则会失败。

答案 1 :(得分: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来执行元素的枚举。

答案 2 :(得分:3)

IEnumerable是可以枚举的东西。 IEnumerator是进行枚举的方法。因此,IEnumerable只定义了一个方法 - GetEnumerator,它返回IEnumerator的实例以执行实际的工作......

答案 3 :(得分:2)

IEnumerable定义一个对象,该对象包含可以枚举的对象聚合。

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

答案 4 :(得分:0)

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

将其简化为简单的for循环:

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

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

答案 5 :(得分:0)

IEnumerable和IEnumerator之间的区别。

  1. IEnumerable在内部使用IEnumerator。
  2. IEnumerable不知道正在执行哪个项目/对象。
  3. IEnumerator知道item / object的当前位置。
  4. IEnumerable不知道item / object的当前位置
  5. IEnumerable有一个方法,GetEnumerator()
  6. 获取代码 - 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() + "----");  
            }