zoukankan      html  css  js  c++  java
  • 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();
            }
  • 相关阅读:
    C# .Net WinForm控件GDI+重绘位置错乱
    查询视图对应的基表名以及视图字段和对应的基表字段名
    解决在高分屏下开发winform界面变形
    ping命令工具:同时ping多个IP
    SmartAssembly批处理用法
    C#二维数组的初始化和存取
    win7 X64 进程名称不一致,导致杀进程失效!
    在存储过程中声明局部游标以循环调用自身
    强制设置双缓冲DoubleBuffered 解决tableLayoutPanel 闪烁
    Using SmartAssembly with MSBuild
  • 原文地址:https://www.cnblogs.com/liujiayun/p/5387193.html
Copyright © 2011-2022 走看看