丁小木的第一天

156 阅读1分钟

今天是第一天,希望有一天回过头来看到当初的自己能有所触动。--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();
}
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);
    }
}