C#枚举集合、IEnumerable接口、IEnumerator接口、手动实现枚举器、使用迭代器来定义枚举器

枚举聚合中的元素

之前我们写过这样的代码:
在这里插入图片描述
foreach极大简化了需要编写的代码,但是foreach只能在特定情况下使用-只能遍历可枚举集合.
什么是可枚举集合?就是实现了System.Collections.IEnumerable接口的集合
在这里插入图片描述
可以看到IEnumerable接口包含了一个名为GetEnumerator的方法:
GetEnumerator返回IEnumerator
也就是返回了实现了IEnumerator接口的枚举器对象
在这里插入图片描述
可将枚举器视为指向列表中的元素的指针.指针最开始指向第一个元素之前的位置。
调用MoveNext方法,就可以让指针移到列表中的下一项,移动成功返回true,否则返回false。
Current属性访问当前指向的项,Rest方法返回到指针第一项之前的位置。
使用集合的GetEnumerator方法创建枚举器,然后反复调用MoveNext方法,并获取Current属性的值,就可以每次在集合中移动一个元素的位置。这就是foreach语句做的事情。

为了创建自己的可枚举集合类,就必须在自己的集合类中实现IEnumerable接口,并提供IEnumerator该接口的一个实现.
以便由集合类的GetEnumerator方法返回.

下面来手动实现枚举器
在这里插入图片描述
代码如下:


        static void InsertIntoTree<TItem>(ref Tree<TItem> tree, params TItem[] data) where TItem : IComparable<TItem>
        {
   
            foreach (TItem datum in data)
            {
   
                if (tree == null)
                {
   
                    tree = new Tree<TItem>(datum);
                }
                else
                {
   
                    tree.Insert(datum);
                }
            }
        }
            public class TreeEnumerator<TItem> : IEnumerator<TItem> where TItem : IComparable<TItem>
    {
   

        private Tree<TItem> currentData = null; //容纳对要枚举的树的引用
        private TItem currentItem = default(TItem);//容纳Current属性返回的值,因为TItem是未知的,我们不知道用什么值来初始化它
        //所以最好的方法就是使用default,如果是引用类型则为null,如果是数值就为0,如果是bool,则为false等等.

        private Queue<TItem> enumData = null;// 用节点的值填充enumData队列

        public TreeEnumerator(Tree<TItem> data) //构造器
        {
   
            this.currentData = data;
        }
        
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值