【问题标题】:IEnumerable & IEnumeratorIEnumerable 和 IEnumerator
【发布时间】:2010-04-14 08:11:11
【问题描述】:

谁能给我解释一下 IEnumerable 和 IEnumerator 有什么区别, 以及如何使用它们?

谢谢!!!

【问题讨论】:

  • 在什么语言/平台上?
  • 那将是 .NET - 已重新标记。

标签: .net interface


【解决方案1】:

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

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

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

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

【讨论】:

  • 我认为 IEnumerator 的示例实现将有助于 OP。一旦你看到这两个是如何配合的,就会清楚得多..
【解决方案2】:

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 的实例来做实际的工作......

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        IEnumerable 表示可以枚举的东西,IEnumerator 是枚举它的东西。

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

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

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

        【讨论】:

        • 这是不正确的——我只是一个int,它没有实现IEnumerator
        【解决方案6】:

        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() + "----");  
                }  
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多