C# 枚举集合

枚举集合指的是,对一个集合中的元素,一次列举出来。

对于数组来说,用for循环和foreach可以实现。foreach能实现,是因为继承了IEnumerator

对于一些自定义的结构,需要手动去写。

这是继承自IEnumerator,

 class TreeEnumerator<TItem>:IEnumerator<TItem> where TItem:IComparable<TItem>
    {
        private Tree<TItem> currentData = null;//二叉树类的引用
        private TItem currentItem = default(TItem);//一个泛型数据,获取当前数的结点值
        private Queue<TItem> enumDada = null;//泛型队列
        public TreeEnumerator(Tree <TItem> data)
        {
            this.currentData = data;
        }
        private void populate(Queue<TItem> enumQueue,Tree<TItem> tree)
        {
            if (tree.LeftTree != null)
            {
                populate(enumQueue, tree.LeftTree);
            }
            enumQueue.Enqueue(tree.NodeData);
            if (tree.RightTree != null)
            {
                populate(enumQueue, tree.RightTree);
            }
        }
        bool System.Collections.IEnumerator.MoveNext()//获取下一个结点的值
        {
            if (this.enumDada == null)
            {
                this.enumDada = new Queue<TItem>();
                populate(this.enumDada, this.currentData);
            }
            if (this.enumDada.Count > 0)
            {
                this.currentItem = this.enumDada.Dequeue();
                return true;
            }
            return false;
        }
        TItem IEnumerator<TItem>.Current
        {
            get
            {
                if (this.enumDada == null)
                {
                    throw new InvalidOperationException("Use MoveNext before calling Current");
                }
                return this.currentItem;
            }
        }
        void IDisposable.Dispose()
        { 
            
        }

        object System.Collections.IEnumerator.Current
        {
            get { throw new NotImplementedException(); }
        }

        public void Reset()
        {
            throw new NotImplementedException();
        }
    }
 public class Tree<TItem> :IEnumerable<TItem> where TItem:IComparable<TItem>
    {
        public TItem NodeData { get; set; }
        public Tree<TItem> LeftTree { get; set; }
        public Tree<TItem> RightTree { get; set; }
        public Tree(TItem nodeValue)
        {
            this.NodeData = nodeValue;
            this.LeftTree = null;
            this.RightTree = null;
        }
        public void Insert(TItem newItem )
        {
            TItem currentNodeValue = this.NodeData;
            if (currentNodeValue.CompareTo(newItem) > 0)
            {
                if (LeftTree == null)
                {
                    this.LeftTree = new Tree<TItem>(newItem);
                }
                else
                {
                    this.LeftTree.Insert(newItem);
                }
            }
            else
            {
                if (RightTree == null)
                {
                    this.RightTree = new Tree<TItem>(newItem);
                }
                else
                {
                    this.RightTree.Insert(newItem);
                }
            }
        }
        IEnumerator<TItem> IEnumerable<TItem>.GetEnumerator()
        {
            return new TreeEnumerator<TItem>(this);
        }


        public void WalkTree()
        {
            if (this.LeftTree != null)
            {
                LeftTree.WalkTree();
            }
            Console.WriteLine(this.NodeData.ToString());
            if (this.RightTree != null)
            {
                RightTree.WalkTree();
            }
        }
        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            throw new NotImplementedException();
        }
    }
 static void Main(string[] args)
        {
            Tree<int> t = new Tree<int>(10);
            t.Insert(4);
            t.Insert(3);
            t.Insert(5);
            t.Insert(14);
            t.Insert(25);
            //   t.WalkTree();
            foreach (int i in t)//这样就可以用foreach去遍历这个二叉树了
            {
                Console.WriteLine(i);
            }
        }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值