zoukankan      html  css  js  c++  java
  • 简单迭代器

    抽象类Iterator

    namespace myIterator
    {
        public abstract class Iterator
        {
            public abstract bool HasNext();
            public abstract object Current();
        }
    }
    View Code

    抽象集合类

    namespace myIterator
    {
        public abstract class Aggregate
        {
            public abstract Iterator Iterator();
        }
    }
    View Code

    Iterator实现类

    namespace myIterator
    {
        public class ConcreteIterator : Iterator
        {
            private readonly ConcreteAggregate _aggregate;
            private int _current;
    
            public ConcreteIterator(ConcreteAggregate aggregate)
            {
                this._aggregate = aggregate;
            }
    
            public override bool HasNext()
            {
                return _current < _aggregate.Count ? true : false;
            }
    
            public override object Current()
            {
                return _aggregate[_current++];
            }
        }
    }
    View Code

    集合实现类

    using System;
    using System.Runtime;
    
    namespace myIterator
    {
        public class ConcreteAggregate : Aggregate
        {
            private readonly object[] _emptyArray = new object[0];
            private object[] _items = new object[4];
            private int now;
    
    
            public int Count
            {
                get { return _items.Length; }
            }
    
            public object this[int index]
            {
                get { return _items[index]; }
                set
                {
                    if (now < _items.Length)
                        _items[now++] = value;
                    else
                    {
                        var size = (int) (_items.Length*1.5);
                        var tem = new object[size];
                        Array.Copy(_items, 0, tem, 0, _items.Length);
                        _items = tem;
                        tem = null;
                    }
                }
            }
    
            public int Capacity
            {
                [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
                get
                {
                    return _items.Length;
                }
                set
                {
                    if (value < now)
                        throw new Exception();
                    if (value == _items.Length)
                        return;
                    if (value > 0)
                    {
                        var objArray = new object[value];
                        if (now > 0)
                            Array.Copy(_items, 0, objArray, 0, now);
                        _items = objArray;
                    }
                    else
                        _items = _emptyArray;
                }
            }
    
            public override Iterator Iterator()
            {
                return new ConcreteIterator(this);
            }
    
            public void Add(object item)
            {
                if (now == _items.Length)
                    EnsureCapacity(now + 1);
                _items[now++] = item;
            }
    
            private void EnsureCapacity(int min)
            {
                if (_items.Length >= min)
                    return;
                int num = _items.Length == 0 ? 4 : _items.Length*2;
                if (num < min)
                    num = min;
                Capacity = num;
            }
        }
    }
    View Code

    测试类

    using System;
    
    namespace myIterator
    {
        internal class Program
        {
            private static void Main(string[] args)
            {
                T0();
                Console.ReadKey();
            }
    
    
            private static void T0()
            {
                var ca = new ConcreteAggregate();
                ca.Add("a");
                ca.Add("b");
                ca.Add("c");
                ca.Add("d");
                ca.Add("e");
    
                Iterator itor = ca.Iterator();
                while (itor.HasNext())
                {
                    Console.WriteLine(itor.Current());
                }
            }
        }
    }
    View Code
  • 相关阅读:
    Laravel 如何在blade文件中使用Vue组件
    历史上的今天mysql数据库包含详情分类以及图片
    【问题】多重继承时,super函数只初始化继承的第一个类,不初始化第二个类。
    pretty-errors:美化python异常输出以使其清晰易读
    python 安装pyinstaller
    python制作ico图标
    Unofficial Windows Binaries for Python Extension Packages
    【转载】wav文件格式分析与详解
    C语言结构体定义位域,从bit0开始,依次到最高bit位
    IP切换脚本
  • 原文地址:https://www.cnblogs.com/lansor/p/3303103.html
Copyright © 2011-2022 走看看