IEnumerator和IEnumerable区别

简介:

这两个接口字面上很相似,其实也有一定的关联。

一个类A实现了IEnumerator,也就是实现Current属性,MoveNext方法,Reset方法。只要实现这些方法,这个类A就可以用foreach这种语法了。

IEnumerable接口主要实现了GetEnumerator方法,该方法返回一个IEnumerator。一个类A实现IEnumerable接口后,调用foreach语法的时候,会自动的调用GetEnumerator方法,然后在这个IEnumerator中遍历。

所以只要实现两者之中任意一个接口,就可以用foreach语法了。但是本质上都是对IEnumerator做foreach,只是一个是直接,一个是间接。

代码说明:比如类baz,实现了IEnumerable,那么下面的代码

foreach (Foo bar in baz)
{
   ...
}

说明代码就功能上等同于下面的代码

IEnumerator bat = baz.GetEnumerator(); 
while (bat.MoveNext()) 

   bar = (Foo)bat.Current() 
   ... 

---------------------

如果一个类,同时实现了IEnumerator<T>,IEnumerable<T>,那么就是糟糕的设计

因为用foreach语法的时候,会先调用IEnumerable的GetEnumerator方法。这是经过测试的。

测试代码如下:

class Class1 : IEnumerator<string>,IEnumerable<string> 

    public int count = 0;

    IEnumerator<string> IEnumerable<string>.GetEnumerator() 
    { 
        return null; 
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
        return null; 
    } 
    ///////////////////////////////////////////

    string IEnumerator<string>.Current 
    { 
        get { return DateTime.Now.ToString(); } 
    }

    void IDisposable.Dispose() 
    { 
    }

    object System.Collections.IEnumerator.Current 
    { 
        get { return DateTime.Now; } 
    }

    bool System.Collections.IEnumerator.MoveNext() 
    { 
        if (count &lt; 10) 
        {

            count++; 
            return true; 
        } 
        else 
        { 
            return false; 
        } 
    }

    void System.Collections.IEnumerator.Reset() 
    { 
        count=0; 
    } 
}

 

---------------main.cs---------

Class1 c = new Class1(); 
           foreach (var i in c) 
           { 
               Console.WriteLine(i); 
           }


















本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/619269 ,如需转载请自行联系原作者

相关文章
|
4月前
|
存储 C# 索引
C# | 比较IEnumerable、List、数组
IEnumerable`定义了一组用于枚举集合的方法,包括`GetEnumerator`方法,该方法返回一个实现了`IEnumerator`接口的对象,用于枚举集合中的每个元素。`List`和数组都可以使用`foreach`循环来遍历其中的元素,这是因为它们都实现了`IEnumerable`接口。 由于数组在内存中开辟了一段连续的空间,因此可以直接通过索引访问元素,访问速度很快。而 List 则需要通过指针或引用来访问元素,速度相对较慢。 由于数组的大小是固定的,当需要添加或删除元素时,需要重新创建一个新数组,将原数组中的元素复制到新数组中,并添加或删除元素。
59 0
C# | 比较IEnumerable、List、数组
|
C# 索引
C#List转IList方法
List类:表示可通过索引访问的对象的强类型列表,提供用于对列表进行搜索、排序和操作的方法。 IList接口:表示可按照索引单独访问的一组对象。
263 0
C#List转IList方法
|
SQL .NET 数据库
IEnumerable和IQueryable在使用时的区别
最近在调研数据库查询时因使用IEnumerable进行Linq to entity的操作,造成数据库访问缓慢。此文讲述的便是IEnumerable和IQueryable的区别。 微软对IEnumerable的定义使用场景为Linq to Object,也就是涉及到内存操作时使用。
1273 0