C# 迭代器的实现,整理

本文介绍了如何在C#中实现迭代器,通过声明一个类实现IEnumerable接口,并定义一个内部迭代器类实现IEnumerator。内容包括迭代一组整数,设置游标管理,以及在GetEnumerator、Current、MoveNext和Reset方法中的具体实现。最后通过foreach循环展示了迭代器的使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明一个类实现IEnumerable接口

class MyIEnumerable : IEnumerable {
        public IEnumerator GetEnumerator() {
            throw new NotImplementedException();
        }
    }

实现的接口是要求返回一个IEnumerator。即要实现一个迭代器,所以在这个类中实现这个迭代器

class MyIEnumerable : IEnumerable {
        public IEnumerator GetEnumerator() {
            return new MyIEnumerator();
        }

        class MyIEnumerator : IEnumerator {
            public object Current => throw new NotImplementedException();

            public bool MoveNext() {
                throw new NotImplementedException();
            }

            public void Reset() {
                throw new NotImplementedException();
            }
        }
    }

要迭代的只能使一组东西,这里假设要求迭代一组整数。
并且要求有个游标//迭代使用,设置在第一个元素前面
所以在MyIEnumerable中创建,并且在构造函数中初始化

 

   private int[] _arrayList;
    private int _head;

    public MyIEnumerable(int[] arrayList) {
        _arrayList = arrayList;
        _head = -1;
    }

而在MyIEnumerator中,要处理的是MyIEnumerable,所以在构造函数要求传递一个MyIEnumerable参数

    private MyIEnumerable _myIEnumerable;
    public MyIEnumerator(MyIEnumerable myIEnumerable) {
        _myIEnumerable = myIEnumerable;
    }

所以在GetEnumerator中创建MyIEnumerator对象的时候,把MyIEnumerable自己本身
传递过去

public IEnumerator GetEnumerator() {
    return new MyIEnumerator(this);
}

接下来要实现的是MyIEnumerator中的Current
Current是一个只有Get的属性,需要get的是MyIEnumerable中_arrayList[head]

    public object Current
    {
        get
        {
            return _myIEnumerable._arrayList[_myIEnumerable._head];
        }
    }

MoveNext是判断++head有无越界的,如果没有就返回true

    public bool MoveNext() {
        if (++_myIEnumerable._head<_myIEnumerable._arrayList.Length)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

Reset是重置head使用的,所以只需要把head重置为-1即可。

创建实例,并且使用foreach遍历,打印1到5

    MyIEnumerable myIEnumerable = new MyIEnumerable(new int[] { 1,2,3,4,5});
    foreach (var item in myIEnumerable)
    {
        Console.WriteLine(item);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值