黑马程序员技术交流社区

标题: 如何自己写个集合,用foreach遍历? [打印本页]

作者: 邓建军    时间: 2013-3-28 14:26
标题: 如何自己写个集合,用foreach遍历?
本帖最后由 邓建军 于 2013-4-4 20:42 编辑

这是我自己写的一个集合,现在用foreach遍历不了,如何才能实现用foreach遍历?
/// <summary>
    ///  我的集合类
    /// </summary>
    class MyArrayList
    {
        int[] arr; // 4    3
        int index = 0;

        public MyArrayList(int capcity)
        {
            arr = new int[capcity];
        }

        /// <summary>
        ///  动态数组的容量...
        /// </summary>
        public int Capcity
        {
            get
            {
                return arr.Length;
            }
        }


        /// <summary>
        ///  动态数组的有效元素的个数
        /// </summary>
        public int Count
        {
            get
            {
                return index;
            }
        }

        public MyArrayList()
        {
            arr = new int[4];
        }

        public int this[int index]
        {
            get
            {
                return arr[index];
            }
            set
            {
                arr[index] = value;
            }
        }
        /// <summary>
        ///  增加方法
        /// </summary>
        /// <param name="value"></param>
        public void Add(int value)
        {
            //先判断数组是否存满...
            if (index == arr.Length - 1)
            {
                int[] newArr = new int[arr.Length * 2];
                arr.CopyTo(newArr, 0);
                arr = newArr;
            }
            arr[index] = value;
            index++;
        }


作者: 曾玉锋    时间: 2013-3-28 17:58
自定义集合
//自定义集合,可以存储object类型数据
    public class MyArray : IEnumerable,IEnumerator
    {
        //用于存储数据
        ArrayList list = new ArrayList();
        //用于记录指针或者游标位置
        int index = -1;
        //得到IEnumerator
        public IEnumerator GetEnumerator()
        {
            return (IEnumerator)this;
        }
        //得到当前对象
        public object Current
        {
            get { return list[index]; }
        }
        //游标往后移动一位,如果没有超出list长度,则可以继续遍历,否则遍历结束
        public bool MoveNext()
        {
            index++;
            return index > list.Count - 1 ? false : true;
        }
        //将游标重置
        public void Reset()
        {
            index = -1;
        }
        public void Add(object item)
        {
            list.Add(item);
        }
    }
//======================================================

自定义泛型集合
    //自定义泛型集合
    public class MyList<T> : IEnumerable<T>, IEnumerator<T>,IDisposable
    {
        //创建一个List<T>集合存储对象
        private List<T> list = new List<T>();
        int index = -1;
        //添加对象
        public void Add(T item)
        {
            list.Add(item);
        }
        //因为foreach需要迭代器IEnumerator类型,所以,把当前对象根据里氏转换原则,转换为其父类型
        public IEnumerator<T> GetEnumerator()
        {
            return (IEnumerator<T>)this;
        }
        //这里也不清楚 是干嘛的!!!
        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
        //获得当前对象
        public T Current
        {
            get {
                return list[index];
            }
        }
        //这个是释放对象吧,
        public void Dispose()
        {
            //这里不清楚怎样释放对象资源,我觉得把里面的资源给设为null,然后调用垃圾回收器回收
            //应该没啥问题了,还好了,这里看自己怎么写合适
            this.list = null;
            GC.Collect();
        }
        //...这个没弄明白 ????代码是我自己加的
        object System.Collections.IEnumerator.Current
        {
            get { return Current; }
        }
        //根据游标的位置判断是否已经遍历完所有元素,如果没有遍历完,则可以继续遍历
        public bool MoveNext()
        {
            index++;
            return index > list.Count-1? false : true;
        }
        //将游标重置
        public void Reset()
        {
            index = -1;
        }
    }





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2