[C#] IEnumerable 和 IEnumerator 的区别

一、定义:

IEnumerable:枚举接口。

IEnumerator:枚举器接口。

二、使用方式:

IEnumerable:

IEnumerator GetEnumerator() //返回IEnumerator

IEnumerator:

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

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

Reset() //重置

Dispose() //接口IEnumerator <T>来自接口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<string> Reverse(){...}

 

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

 

public IEnumerator<string> GetEnumerator(){...}

 

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

 

函数

IEnumerator GetEnumerator()

Current{get{}}

MoveNext()

Reset()

Dispose()

关系

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

返回 IEnumerator<T> 或 IEnumerable<T> 的迭代器的产生类型是 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值