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的类。

  • 相关阅读:
    Microsoft Enterprise Library 5.0 系列(二) Cryptography Application Block (初级)
    Microsoft Enterprise Library 5.0 系列(五) Data Access Application Block
    Microsoft Enterprise Library 5.0 系列(八) Unity Dependency Injection and Interception
    Microsoft Enterprise Library 5.0 系列(九) Policy Injection Application Block
    Microsoft Enterprise Library 5.0 系列(三) Validation Application Block (高级)
    软件研发打油诗祝大家节日快乐
    从挖井的故事中想到开发管理中最容易忽视的几个简单道理
    ITIL管理思想的执行工具发布
    管理类软件设计“渔”之演化
    20070926日下午工作流与ITILQQ群 事件管理 讨论聊天记录
  • 原文地址:https://www.cnblogs.com/zhangran/p/2648357.html
Copyright © 2011-2022 走看看