[C#] IEnumerable 和 IEnumerator 的区别

一、定义:

IEnumerable:枚举接口。

IEnumerator:枚举器接口。

二、使用方式:

IEnumerable:

IEnumerator GetEnumerator() //返回IEnumerator

IEnumerator:

Current{get{}}//返回元素的光标所在的位置

MoveNext() //移动到集合的下一个元素

Reset() //重置

Dispose() //接口IEnumerator 来自接口IDisposable,从而定义了该方法清理由enumerator分配的资源。

 

三、特点:

IEnumerable

1. 实现IEnumerable不是必需的。

2. 当你实现IEnumerable,你也必须实现IEnumerator。

3. 通过GetEnumerator()返回一个IEnumerator。

IEnumerator

1. 可用于读取集合中的数据,但不能用于修改基础集合。

2. 枚举数位于集合中的第一个元素之前。必须调用MoveNext方法将枚举数提前到集合的第一个元素之前读取Current;否则,Current将是不确定的。

3. Current返回相同的对象直到MoveNext或Reset被调用。MoveNext设置到下一个元素。

4. 如果MoveNext读取到了集合的末尾,枚举数定位在最后一个元素之后,MoveNext返回false。当枚举数位于此位置,随后调用MoveNext也返回false。如果MoveNext返回false,则Current抛出异常。

5. 没有它,就不能使用foreach语句遍历集合或数组,因为只有IEnumerator对象才能访问集合中的项。通过foreach语句遍历集合的应用。

 

 


四、区别:

 

 

IEnumerable

IEnumerator

名称

枚举接口

枚举器接口

使用方式

public IEnumerable Reverse(){...}

 

foreach (var title in titles.Reverse()){...}

 

public IEnumerator GetEnumerator(){...}

 

foreach (var title in titles){...}

 

函数

IEnumerator GetEnumerator()

Current{get{}}

MoveNext()

Reset()

Dispose()

关系

返回 IEnumerator 或 IEnumerable 的迭代器的产生类型是 object。

返回 IEnumerator 或 IEnumerable 的迭代器的产生类型是 T。

如果实现IEnumerable,则必须实现IEnumerator。

foreach通过GetEnumerator()方法返回一个IEnumerator对象,调用方法MoveNext()进行遍历,返回current值。

 

 

五、实例:

 

    public class Person

    {

        public Person(string name)

        {

            this.name = name;

        }

        public string name;

    }

 

//IEnumerator:

    public class enumerator : IEnumerator

    {

        public Person[] p;

        public int i;

        public enumerator(Person[] p0)

        {

            p = new Person[p0.Length];

            for (int j = 0; j < p0.Length; j++)

            {

                p[j] = new Person(p0[j].name);

            }

            i = -1;

        }

        public object Current { get{ return p[i]; } }

        public bool MoveNext()

        {

            if (i < p.Length-1)

            {

                i++;

                return true;

            }

            else

            {

                return false;

            }

        }

        public void Reset()

        {

            i = -1;

        }

    }

 

 

  //IEnumerable:

   public class enumerable : IEnumerable

    {

        public Person[] p;

        public enumerable()

        {

            p = new Person[3];

            p[0] = new Person("a");

            p[1] = new Person("b");

            p[2] = new Person("c");

        }

        public IEnumerator GetEnumerator()

        {

            enumerator a = new enumerator(p);

             return a;

        }

    }

 

    class Program

    {

        static void Main(string[] args)

        {

            enumerable pp;

            pp = new enumerable();

            foreach (Person ps in pp)

            {

                Console.WriteLine(ps.name);

            }

            Console.ReadLine();

        }

    }

}

 

 

输出结果:

a

b

c

你可能感兴趣的:([C#] IEnumerable 和 IEnumerator 的区别)