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();
            }
  • 相关阅读:
    Java 注解指导手册(下)
    CentOS安装Redis Sentinel HA集群
    EasyBCD安装CentOS双系统
    读《大型网站技术架构核心原理与案例分析》
    CentOS的Redis内存分配策略配置
    CentOS搭建VSFTP
    freemaker分页备忘
    jenkins持续集成配置备忘
    Redis常用命令
    stream转byte数组几种方式
  • 原文地址:https://www.cnblogs.com/liujiayun/p/5387193.html
Copyright © 2011-2022 走看看