深入理解 c# 第六章 利用yield语句简化迭代器 c#2

本文介绍了一个简单的C#迭代器块实现案例,通过IteratorBlockIterationSample类展示如何使用yield return返回IEnumerable集合中的元素,并从指定起始位置开始迭代。
    class IteratorBlockIterationSample : IEnumerable
    {
        object[] values;
        int startingPoint;

        public IteratorBlockIterationSample(object[] values, int startingPoint) //实例化类的时候调用
        {
            this.values = values; // 一个是 a b c d e 
            this.startingPoint = startingPoint; // 3
        }

        public IEnumerator GetEnumerator()  // 关键字 in 调用
        {
            for (int index = 0; index < values.Length; index++)  // valuse.length= 5  执行完一次 index+1 index = 1 
            {
                yield return values[(index + startingPoint) % values.Length]; // 返回values[3] values[4] values[0] [1] [2]
            } //yield 告诉编译器迭代器块的方法,返回一个Ienumerator接口  返回的类型要和代码块的类型兼容
        } //7行代码搞定  还有4行括号 替换整个IterationSampleiterator类

        static void Main()
        {
            object[] values = { "a", "b", "c", "d", "e" };
            IteratorBlockIterationSample collection = new IteratorBlockIterationSample(values, 3);
            foreach (object x in collection)
            {
                Console.WriteLine(x);  //输出 d  调用in 调用for 循环, 得到e,输出e 调用in 调用for, 输出 a b c
            }
        }
    }

当编译器看到迭代器块的时候,会为状态机创建一个嵌套类型 来记录块中的位置以及局部变量的值。

要实现迭代器,状态机要做的事

1 具有某个初始状态

2 每次调用MoveNext时,提供下一个值之前(换句话说,就是执行到yield return语句之前),它需要

执行GetEnumerator方法中的代码

3 使用Current属性,它必须返回我们生成的上一个值

4 它必须知道何时完成生成值的操作,以便MoveNext返回False

输出


d
e
a
b
c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值