zoukankan      html  css  js  c++  java
  • IEnumerator和IEnumerable的关系

    借鉴了这篇文章,给了俺巨大的帮助啊http://www.cnblogs.com/tnspop/archive/2012/03/15/2397666.html

    用自己的话总结一下,便于以后自己的理解:

           IEnumerator与IEnumerable用两个用来实现枚举的借口,相互协助来完成创建一个具有枚举功能的集合。

    首先如果是自己定义一个类,里面含有数组元素,然后想对该类进行foreach循环是做不到的,为什么他们arraylist,list等等集合能枚举,我自己定义的类就不能枚举呢,关键原因是自己的类缺少一个GetEnumerator()方法。

           当用foreach循环来访问一个对象的时候,其实是默认的调用了对象里面的GetEnumerator()方法。而该方法就是由IEumerable借口给暴露出来的,所以如果想自定义一个能实现枚举功能的集合类就要先实现一个IEnumerable接口,然后实现里面的GetEnumerator方法。如下所示:

     

    namespace Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                Garage car = new Garage();
                foreach(Car c in car)
                {
                    Console.WriteLine("{0} is going {1} MPH", c.Name, c.Age);
                }
                Console.ReadKey();
            }
        }
        public class Garage:IEnumerable 
        {        
            Car[] carArray = new Car[4];  
            //在Garage中定义一个Car类型的数组carArray,其实carArray在这里的本质是一个数组字段        
            
    //启动时填充一些Car对象        
            public Garage()        
            {            
                //为数组字段赋值            
                carArray[0] = new Car("Rusty"30);            
                carArray[1] = new Car("Clunker"50);            
                carArray[2] = new Car("Zippy"30);            
                carArray[3] = new Car("Fred"45);        
            }

            public IEnumerator GetEnumerator()
            { 
                return this.carArray.GetEnumerator();
            }
        }
        public class Car
        {
            public string Name { getset; }
            public int Age { getset; }
            public Car(string name,int age)
            {
                Name = name;
                Age = age;
            }
        }
    }

          看到代码中的GetEnumerator方法,返回的是一个IEnumerator 接口。这个借口里面才是具体的如何迭代一个集合的方法。但是上面的代码中我们直接返回了carArray中的这个方法,因为carArray是数组类型,它默认形况下对该IEnumerator中的方法进行了实现。所以这样可以简单的实现迭代,当然如果要自定义这个接口中的方法,让其按照自己的意图来迭代数据的话,大可返回一个自己写的实现了IEnumerator的类。

  • 相关阅读:
    Get-CrmSetting返回Unable to connect to the remote server的解决办法
    Dynamics 365中的常用Associate和Disassociate消息汇总
    Dynamics 365 Customer Engagement V9 活动源功能报错的解决方法
    Dynamics Customer Engagement V9版本配置面向Internet的部署时候下一步按钮不可点击的解决办法
    Dynamics 365检查工作流、SDK插件步骤是否选中运行成功后自动删除系统作业记录
    注意,更改团队所属业务部门用Update消息无效!
    Dynamics 365的审核日志分区删除超时报错怎么办?
    Dynamics 365使用Execute Multiple Request删除系统作业实体记录
    Dynamics 365的系统作业实体记录增长太快怎么回事?
    Dynamics CRM日期字段查询使用时分秒的方法
  • 原文地址:https://www.cnblogs.com/zhangran/p/2648357.html
Copyright © 2011-2022 走看看