Foreach能够循环的本质

我们对foreach循环并不陌生,在C#中我们用得非常多,但是我们是否清楚foreach循环的本质呢? 众所周知,foreach循环能够遍历 数组  ,集合 。但是我们自己定义的一个类是否能够通过foreach循环遍历出来呢?

Foreach能够遍历的数据类型都是实现了  IEnumerable 接口的  意思就是说 只要我自定义的类实现了  IEnumberable接口  我都能够通过foreach来循环遍历

下面举一个简单的例子

 

 

首先自定义一个类 并实现  IEnumberable 接口

在Mylist类中,实现了IEnumberable接口后 必须  实现其中的  GetEnumberator()方法  而GetEnumberato方法中的返回值类型是  IEnumberator接口 类型

所以我们就自然而然想到了定义一个类  来实现  IEnumberator接口   利用里氏替换原则  返回子类类型

 public  class Mylist:IEnumerable
    {
       ArrayList list = new ArrayList();
       //写一个自定义的Add方法()
       public void Add(object ob)
       {
           list.Add(ob);
       }
       //实现IEnumerable接口的GetEnumerator()方法
        public IEnumerator GetEnumerator()
        {
            return new MyTool(list);
        }
    }
/// <summary>
    /// 实现  IEnumberyor接口时  必须实现该接口的  所有方法  即  Current()  :  返回一个集合中的一项的值
    ///                                                          MoveNext() :  系统自动调用MoveNext()方法  
    ///                                                          Reset()   :    系统会在MoveNext方法返回一个false值的时候自动调用  将索引值重置
    /// </summary>
    public class MyTool : IEnumerator
    {
        ArrayList list = new ArrayList();
        public MyTool(ArrayList li)
        {
            list=li;
        }
        int i = -1;//给定初始位置  表示第一条数据之前
        //Current属性
        public object Current
        {
            get { return list[i]; }
        }

        //自动调用MoveNext方法  调用下一条记录
        public bool MoveNext()
        {
            bool Result = false;
            if(i<list.Count-1)
            {
                i++;
                Result = true;
            }
            return Result;
        }

        public void Reset()
        {
            i = -1;
        }
    }

以上  foreach 循环的 本质  就是这些了

以下代码就是实现自定义类  用foreach循环实现

static void Main(string[] args)
        {
            Mylist list = new Mylist();
            list.Add("张三");
            list.Add("李四");
            list.Add("王五");
          
            foreach (object item in list)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }

 

posted @ 2016-04-13 15:01  巴黎的雨季  阅读(600)  评论(0编辑  收藏  举报