IEnumerator和IEnumerable

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IEnumerator和IEnumerable相关的知识,希望对你有一定的参考价值。

IEnumerable和IEnumerator两个接口的语法定义。其实IEnumerable接口是非常的简单,只包含一个抽象的方法GetEnumerator(),它返回一个可用于循环访问集合的IEnumerator对象。IEnumerator对象有什么呢?它是一个真正的集合访问器,没有它,就不能使用foreach语句遍历集合或数组,因为只有IEnumerator对象才能访问集合中的项,假如连集合中的项都访问不了,那么进行集合的循环遍历是不可能的事情了。那么让我们看看IEnumerator接口有定义了什么东西。看下图我们知道IEnumerator接口定义了一个Current属性,MoveNext和Reset两个方法,这是多么的简约。既然IEnumerator对象时一个访问器,那至少应该有一个Current属性,来获取当前集合中的项吧。

MoveNext方法只是将游标的内部位置向前移动(就是移到一下个元素而已),要想进行循环遍历,不向前移动一下怎么行呢?(转载)

    public static void Main(string[] args)
        {
            List<string> Person = new List<string>();
            Person.Add("zhang");
            Person.Add("hehe");
            var s = Person.Select(p => p);
            print(s);
            Console.WriteLine(s);
            Console.ReadKey();
        }
        public static void print(IEnumerable<string> ie)
        {
            IEnumerator<string> s = ie.GetEnumerator();
            while(s.MoveNext())
            {
                Console.WriteLine(s.Current);
            }

        }


说到IEnumerable总是会和IEnumerator、foreach联系在一起。

C# 支持关键字foreach,允许我们遍历任何数组类型的内容:

//遍历数组的项

int[] myArrayOfInts = {10,20,30,40};

foreach(int i in my myArrayOfInts)

{

Console.WirteLine(i);

}

虽然看上去只有数组才可以使用这个结构,其实任何支持GetEnumerator()方法的类型都可以通过foreach结构进行运算。

 

一个类型是否支持foreach遍历,必须满足下面条件:

方案1:让这个类实现IEnumerable接口

方案2:这个类有一个public的GetEnumerator的实例方法,并且返回类型中有public 的bool MoveNext()实例方法和public的Current实例属性。

以上是关于IEnumerator和IEnumerable的主要内容,如果未能解决你的问题,请参考以下文章

转载 IEnumerable和IEnumerator 详解

IEnumerator和IEnumerable

IEnumerable和IEnumerator 详解

IEnumerator和IEnumerable详解

IEnumerator和IEnumerable详解

实现自定义集合的可枚举类型(IEnumerable)和枚举数(IEnumerator )