丁小木的第一天

195 阅读2分钟

今天是第一天,希望有一天回过头来看到当初的自己能有所触动。--2018-11-27

1.IEnumerable实现了这个接口便可以迭代。Linq中的扩展方法中,自己用到的方法都实现了这个接口。IEnumerable中只有一个方法:IEnumerator GetEnumerator();方法返回的接口又实现了IDisposable和IEnumetator以及自己有个属性T Current{get;},这个属性表示集合中位于枚举数当前位置的元素。实现的接口分别含有释放托管资源的任务方法Dispose(),当然这个接口不是关注重点,后面才是。IEnumerator,此接口有一个属性object Current{get;},两个方法bool MoveNext()表示移到下一位,void Reset()表示重置(在第一个元素之前);属性都没有加修饰符,默认为private,并且都有Current属性。自己写了个类似的,说是如果隐藏就用new(先留意一下,日后再看书解决吧)。由于属性是只读的,这也就是为什么foreach遍历的时候不能够修改。大概流程就是通过方法获取对象,通过MoveNext移动下一位,顺便判断是否存在下一位,然后取值。实现如下:

class Program
    {
        static void Main(string[] args)
        {
            string[] str = new string[] { "1", "2", "3", "4", "5" };
            //获取数组
            MyIEnumerable a = new MyIEnumerable(str);
            //获取遍历方法的对象
            Btor b= a.GetEnumerator();
            //执行遍历方法
            while (b.MoveNext())
            {
                Console.WriteLine(b.Current);
            }
            Console.ReadKey();

        }

    }
    public  interface Able
    {
        Btor GetEnumerator();
    }
    public  interface Btor
    {
        object Current { get; }
        bool MoveNext();
        void Reset();
    }

    //实现GetEnumerable的返回值接口,初始化获取传入的数组,position指明位置,current当前位置的值,方法移动
    public class MyIEnumerator : Btor
    {
        private string[] strList;
        private int position;
        public MyIEnumerator(string[] _strList)
        {
            strList = _strList;
            position = -1;
        }
        public object Current
        {
            get { return strList[position]; }
        }
        public bool MoveNext()
        {
            position++;
            if (position<strList.Length)
            {
                return true;
            }
                return false;
        }
        public void Reset()
        {
            position = -1;
        }

    }
    //实现接口,通过方法获得实例
    public class MyIEnumerable : Able
    {
        private string[] strList;
        public MyIEnumerable(string []_strList)
        {
            strList = _strList;
        }
        public Btor GetEnumerator()
        {
            return new MyIEnumerator(strList);
        }
    }```