【读】构建可枚举类型(IEnumerator和IEnumerable)

转自:http://www.cnblogs.com/tnspop/archive/2012/03/15/2397666.html

 //构建可枚举类型(IEnumerable和IEnumerator),让自定义类型支持类似foreach的枚举

 
//这个接口告诉调用方对象的子项可以枚举
//public interface IEnumerable
//{
//    IEnumerator GetNumerator();
//}
//可以看到,GetEnumerator()方法返回另一个接口System.Collections.IEnumerator的引用。这个接口提供了基础设施,
//调用方法可以用来移动IEnumerable兼容器包含的内部对象:
//这个接口允许调用方获取一个容器的子项
//public interface IEnumerator
//{
//    bool MoveNext();    //将光标的内部位置向前移动
//    object Current {get;}//获取当前的项(只读属性)
//    void Reset();//将光标重置到第一个成员前面
//}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
 
namespace Garage
{
    public class Car
    {
        private string name;
        private double speed;
 
        public Car()
        {
            name = "null";
            speed = 0;
        }
 
        public Car(string name, double speed)
        {
            this.name = name;
            this.speed = speed;
        }
 
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public double Speed
        {
            get { return speed; }
        }
    }
 
    public class Garage:IEnumerable
    {
        private Car[] carArray;
        
        public Garage()
        {
            carArray = new Car[4];
            carArray[0] = new Car("Rusty", 50);
            carArray[1] = new Car("Clunker", 55);
            carArray[2] = new Car("Zippy", 30);
            carArray[3] = new Car("Fred", 30);
        }
 
        /// <summary>
        /// 这是一个接口的显示实现
        /// </summary>
        /// <returns></returns>
        IEnumerator IEnumerable.GetEnumerator()
        {
            //因为System.Array类型已经实现了IEnumerator和IEnumerable的接口,可以简单委托请求到System.Array
            //返回数组对象的Enumerator.
            return carArray.GetEnumerator();
        }
 
        /// <summary>
        /// 这是一个接口在对象级别的调用
        /// </summary>
        /// <returns></returns>
        //public IEnumerator GetEnumerator()
        //{
        //    return carArray.GetEnumerator();
        //}
 
    }
    class Program
    {
        static void Main(string[] args)
        {
            Garage carLot = new Garage();
 
            foreach (Car c in carLot)
            {
                Console.WriteLine("{0} is going {1} MPH", c.Name, c.Speed);
            }
 
 
            //这是在对象级别的引用
            //因为GetEnumerator()被定义为公开的,所以,可以在对象级别进行引用
            //可以手动和IEnumerator协作
            //IEnumerator i = carLot.GetEnumerator();
            //i.MoveNext();
            //Car myCar = (Car)i.Current;
            //Console.WriteLine("{0} is going {1} MPH", myCar.Name, myCar.Speed);
            //如果想要在对象级隐藏IEnumerator接口,简单使用显示接口实现就行了
        }
    }
}
原文地址:https://www.cnblogs.com/chenyongblog/p/3116049.html