C#枚举器基本用法

首先看一段代码

            int[] arr = new int[] { 1, 2, 3, 4, 5 };
            foreach(int ele in arr)
            {
                Console.Write(ele + " ");
            }

输出是“1,2,3,4,5”。问题来了,为什么foreach语句能够依次读取出数组arr中的元素呢?这是因为,数组arr能为foreach提供一个枚举器。

那什么是枚举器?枚举器就是实现IEnumerator接口的类对象。IEnumerator接口的定义如下:

    public interface IEnumerator
    {
        object Current { get; }
        bool MoveNext();
        void Reset();
    }

数组arr为什么能为foreach提供枚举器呢?因为数组类型是可枚举类型,可枚举类型提供了GetEnumerator()方法用于返回当前正在使用的枚举器。而GetEnumerator()方法是IEnumerable接口的唯一成员。也就是说,可枚举类型是指实现了IEnumerable接口的类型。

回过头来,看第一段代码的执行过程:

  1. 系统自动调用arr.GetEnumerator(),返回一个Enumerator引用。
  2. 调用Enumerator引用的MoveNext()方法。
  3. 如果MoveNext()方法返回true,调用Enumerator引用的Current属性获取数组中的当前元素,用于foreach循环。
  4. 重复2,3循环,直至MoveNext()方法返回false;

也就是说,第一段代码等效下列代码:

            int[] arr = new int[] { 1, 2, 3, 4, 5 };
            IEnumerator ie = arr.GetEnumerator();
            while (ie.MoveNext())
            {
                Console.Write("{0} ", ie.Current);
            }
            Console.WriteLine();

最后,IEnumerator接口和IEmerable接口位于System.Collections的命空间中,支持对非泛型集合的简单迭代。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值