深入理解 c# 第六章 手写迭代器的痛苦 c#1

   class IterationSample : IEnumerable  //框架
    {
        object[] values;
        int startingPoint;

        public IterationSample(object[] values, int startingPoint) //主函数调用 一个是 a b c d e , 一个是 3 开始的位置是d
        {//设置构造函数的设置值和起点
            this.values = values;
            this.startingPoint = startingPoint;
        }

        public IEnumerator GetEnumerator()  //collection  迭代器不用一次返回所有的数据  调用一次访问一个元素
        {
            return new IterationSampleIterator(this);
        }

        class IterationSampleIterator : IEnumerator  //创建另外一个类,让分工明确  嵌套类实现集合迭代器
        {
            IterationSample parent;  //正在迭代的集合
            int position;  //指出遍历的位置

            internal IterationSampleIterator(IterationSample parent) //return new InterationSampleIterator(this)调用
            {
                this.parent = parent;
                position = -1; //position为-1   在第一个元素之前开始
            }

            public bool MoveNext()  //in 调用MoveNext函数
            {
                if (position != parent.values.Length)  //position为-1 length=5  开始为d 后面为e a b c c的时候postion为4
                {//如果仍要遍历,增加position的值
                    position++;  //原本值为-1, 返回时position=0  =1 =2 =3 =4  =5
                }
                return position < parent.values.Length; //postion为0 1 2 3 4 5  true之后true true ture true false
            }//false 就跳出循环

            public object Current
            {
                get
                {
                    if (position == -1 ||  //阻止访问第一个元素之后和最后一个元素之后
                        position == parent.values.Length)
                    {
                        throw new InvalidOperationException();
                    }
                    int index = (position + parent.startingPoint);  //实现封装  返回元素 对位置进行偏移
                    index = index % parent.values.Length;
                    return parent.values[index];
                }
            }

            public void Reset()
            {
                position = -1;  //返回第一个元素之前
            }
        }

        static void Main()
        {
            object[] values = { "a", "b", "c", "d", "e" };
            IterationSample collection = new IterationSample(values, 3);
            foreach (object x in collection)  //x 为 d e a b c  collectino调用GetEnumerator
            {
                Console.WriteLine(x);
            }
        }
    }


输出

d
e
a
b
c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值