C#学习笔记(二十三)枚举数和可枚举类型

本文详细介绍了C#中的枚举接口,包括IEnumerator、IEnumerable和IEnumerator<T>、IEnumerable<T>。其中IEnumerator接口的Current、MoveNext和Reset方法分别用于获取当前项、移动到下一个元素和重置枚举器。而IEnumerable接口通过GetEnumerable提供枚举数。最后,IEnumerator<T>和IEnumerable<T>使用泛型提供更具体的类型操作。

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

  1. IEnumerator接口

    IEnumerator接口包含3个函数成员:Current、MoveNext以及Reset

  • Current返回序列中当前位置项的属性。

    它是只读属性。
    它返回object类型的引用,所以可以返回任何类型。

  • MoveNext是把枚举数位置前进到集合中下一项的方法。

    如果有新的位置是有效的,方法返回true。
    如果新的位置是无效的,方法返回false。
    枚举数的原始位置在序列中的第一项之前。MoveNext必须在第一次使用Current之前使用。

  • Reset方法把位置重置为原始状态。
    class Program
    { 
        static void Main(string[] args)
        {
            int[] array = new int[6] { 1, 2, 3, 4, 5, 7 };

            IEnumerator enumerator = array.GetEnumerator();

            //将枚举数推进到集合的下一个元素。
            //返回结果:如果枚举数已成功地推进到下一个元素,则为 true;如果枚举数传递到集合的末尾,则为 false。
            while (enumerator.MoveNext())
            {
                //获取集合中位于枚举数当前位置的元素。
                //返回结果:集合中位于枚举数当前位置的元素。
                Console.WriteLine(enumerator.Current);
            }

            Console.ReadKey();
        }      
    }


     2.IEnumerable接口

     IEnumerable接口只含有一个函数成员:GetEnumerable

     GetEnumerable返回对象的枚举数

    class Number : IEnumerator
    {
        private int index = -1;
        private readonly int[] number;

        public Number(int[] param)
        {
            number = param;
        }

        public object Current
        {
            get
            {
                if (index == -1)
                {
                    throw new IndexOutOfRangeException();
                }
                else if (index == number.Length)
                {
                    throw new IndexOutOfRangeException();
                }
                else
                {
                    return number[index];
                }

            }
        }


        bool IEnumerator.MoveNext()
        {
            if (index < number.Length - 1)
            {
                index++;
                return true;
            }
            else
            {
                return false;
            }
        }

        void IEnumerator.Reset()
        {
            index = -1;
        }
    }

    class GetNumber : IEnumerable
    {
        readonly int[] array = new int[6] { 1, 2, 3, 4, 5, 7 };

        public IEnumerator GetEnumerator()
        {
            Number number = new Number(array);
            return number;
        }
    }

    class Program
    { 
        static void Main(string[] args)
        {
            GetNumber getNumber = new GetNumber();
            foreach (int number in getNumber)
            {
                Console.WriteLine(number);
            }

            Console.ReadKey();
        }      
    }

3.IEnumerator<T>接口
IEnumerator<T>接口使用泛型来返回实际的类型,而不是object类型的引用。
IEnumerator<T>接口从另外两个接口继承-IEnumerator接口和IDisposable接口。
IEnumerator<T>接口本身只有一个Current的成员,其他的成员都是实现其继承的另外的两个接口。

4.IEnumerable<T>接口
IEnumerable<T>接口继承自IEnumerable接口。
IEnumerable<T>接口有俩个GetEnumerable成员,一个是自身接口的成员,一个是实现IEnumerable接口的成员。

    //通过使用泛型接口,可以避免值类型的拆箱和装箱的过程,
    //也避免了object转换时可能发生的类型异常
    public class Number : IEnumerator<int>
    {
        private int index = -1;
        private readonly int[] number;

        public Number(int[] param)
        {
            number = param;
        }

        object IEnumerator.Current
        {
            get
            {
                if (index == -1)
                {
                    throw new IndexOutOfRangeException();
                }
                else if (index == number.Length)
                {
                    throw new IndexOutOfRangeException();
                }
                else
                {
                    return number[index];
                }

            }
        }
        public int Current
        {
            get
            {
                if (index == -1)
                {
                    throw new IndexOutOfRangeException();
                }
                else if (index == number.Length)
                {
                    throw new IndexOutOfRangeException();
                }
                else
                {
                    return number[index];
                }

            }
        }

        public bool MoveNext()
        {
            if (index < number.Length - 1)
            {
                index++;
                return true;
            }
            else
            {
                return false;
            }
        }

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

        #region IDisposable Support
        private bool disposedValue = false; // 要检测冗余调用

        protected virtual void Dispose(bool disposing)
        {
            if (!disposedValue)
            {
                if (disposing)
                {
                    // TODO: 释放托管状态(托管对象)。
                }

                // TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器。
                // TODO: 将大型字段设置为 null。

                disposedValue = true;
            }
        }


        // 添加此代码以正确实现可处置模式。
        public void Dispose()
        {
            // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
            Dispose(true);
            // TODO: 如果在以上内容中替代了终结器,则取消注释以下行。
            // GC.SuppressFinalize(this);
        }
        #endregion
    }

    class GetNumber : IEnumerable<int>
    {
        readonly int[] array = new int[6] { 1, 2, 3, 4, 5, 7 };

        public IEnumerator<int> GetEnumerator()
        {
            Number number = new Number(array);
            return number;
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            Number number = new Number(array);
            return number;
        }
    }

    class Program
    { 
        static void Main(string[] args)
        {
            GetNumber getNumber = new GetNumber();
            foreach (int number in getNumber)
            {
                Console.WriteLine(number);
            }

            Console.ReadKey();
        }      
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值