IEnumerator和IEnumerable详解

本文详细介绍了C#中IEnumerable和IEnumerator接口的概念及使用方法,包括如何自定义实现这两个接口来支持foreach循环遍历,解释了GetEnumerator、Current、MoveNext和Reset等方法的作用。

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


   IEnumerable 可以枚举的意思,IEnumerator 迭代器
    public interface IEnumerable
    {
        //返回迭代器,是使用foreach 的前提
        [DispId(-4)]
        IEnumerator GetEnumerator();
    }

  
    public interface IEnumerator
    {
        //集合中的当前元素。
        object Current { get; }

        //将枚举数推进到集合的下一个元素。
        bool MoveNext();
     
        //将枚举数设置为其初始位置,该位置位于集合中第一个元素之前。
        void Reset();
    }

    ///自定义IEnumerable
    public  class AnimalIEnumerable : IEnumerable
    {
        private string[] arr = new string[] { "dog","cat","fish","pig","tigger","panda","chicken"};
        public IEnumerator GetEnumerator()
        {
            return new AnimalEnumerator(arr);
        }

        class AnimalEnumerator : IEnumerator
        {
            private string[] mData;
            private int index = -1;
            private string mEle;
            public AnimalEnumerator(string[] arr)
            {
                mData = arr;
            }

            public object Current
            {
                get { return mEle; }
            }

            public bool MoveNext()
            {
                if (index < mData.Length-1)
                {
                    mEle = mData[++index];
                    return  true;
                }
                return false;
            }

            public void Reset()
            {
                index = -1;
            }
        }
    }

     ///方法一
    AnimalIEnumerable animals = new AnimalIEnumerable();
    foreach (string item in animals)
    {
        Console.WriteLine(item);
    }

    ///方法二
    var enumerator = animals.GetEnumerator();
    while (enumerator.MoveNext())
    {
        Console.WriteLine(enumerator.Current);
    }

 方法一调用和方法二调用 等价

 

总结:

1. getEnumerator() 返回迭代器

2. Current 返回当前迭代的值

3. MoveNext() 判断是否可以迭代,并让current 指向下一个值。

4. reset() 重置枚举器的状态

也就是说foreach其实是一种语法糖,用来简化对可枚举元素的遍历代码。而被遍历的类通过实现IEnumerable接口和一个相关的IEnumerator枚举器来实现遍历功能。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值