枚举器和迭代器(二)

迭代器就是用于生成一个即是枚举器又是可枚举对象的。其实这句话并不十分的准确,因为迭代器生成一个枚举器,还是生一个即是枚举器又是可枚举对象,取决于迭代器的返回值。迭代器是一个包含yield语句的方法、属性或索引器;而且迭代器必须返回四种接口中的一种,这四种接口分别是:

1、   IEnumerator

2、  IEnumerator<T>

3、  IEnumerable

4、  IEnumerable<T>

例如我们定义一个用于返回010之间的偶数的迭代器:

     static IEnumerator<int> EvenNmbers()

        {

            for (int i = 0; i <= 10; i++)

            {

                if (i % 2 == 0)

                {

                    yield return i;

                }

            }

             }

     这个方法的返回类型为IEnumerator<int>yield return i;语句并不会像我们普通方法中的return语句直接中止方法并返回,而只是把一个值返回到IEnumerator<int>中,这样直到for循环结束。迭代器中不允许出现return语句,如果想中结束迭代器,可以用yield break;语句。使用迭代器和使用普通的方法一样(属性、索引器)。

     static void Main(string[] args)

        {

            IEnumerator<int> evenNumber = EvenNmbers();

            while (evenNumber.MoveNext())

            {

                Console.WriteLine(evenNumber.Current);

            }

            Console.ReadKey();

           }

     上例中的迭代器会被编译成类似下面的一个类:

       private sealed class <EvenNmbers>d__0 : IEnumerator<int>, IEnumerator, IDisposable

     它实现了两个枚举器接口。

如果上例的迭代器返回的是IEnumerator<int>:

        static IEnumerable<int> EvenNmbers()

        {

            for (int i = 1; i <= 10; i++)

            {

                if (i % 2 == 0)

                {

                    yield return i;

                }

            }

            }

那么它编译后:

private sealed class <EvenNmbers>d__0 : IEnumerable<int>, IEnumerable, IEnumerator<int>, IEnumerator, IDisposable

不仅实例枚举器接口,还实现了可枚举接口IEnumerable。这样我们便可以使用foreach语句迭代偶数枚举了。

        static void Main(string[] args)

        {

            foreach (var even in EvenNmbers())

            {

                Console.WriteLine(even);

            }

            Console.ReadKey();

             }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值