IEnumerator 和IEnumerable,及其泛型

来源:互联网 发布:was java找文件路径 编辑:程序博客网 时间:2024/05/16 13:49

1.一个collection要支持foreach,即对集合中的对象进行遍历(traverse),要遍历一个集合对象则需要满足下面条件:
方案a.让这个类实现IEnumerable接口
方案b:该类拥有一个public 的GetEnumerator()实例方法

2.IEnumerator
这个接口提供2个方法,1个只读属性

public interface IEnumerator{    bool MoveNext();//迭代器下移    Object current{get;}//迭代器当前的位子    void Reset();//迭代器重置复位}

3.IEnumerable
这个接口只提供了一个方法

public interface IEnumerable{    IEnumerator GetEnumerator();}

这个方法返回一个用于循环访问集合的IEnumerator对象

4.IEnumerator versu IEnumerable
从这两个接口的用词选择上,也可以看出其不同:IEnumerable是一个声明式的接口,声明实现该接口的class是“可枚举(enumerable)”的,但并没有说明如何实现枚举器(iterator);IEnumerator是一个实现式的接口,IEnumerator对象就是一个iterator(迭代器)。

5.两者联系
IEnumerable和IEnumerator通过IEnumerable的GetEnumerator()方法建立了连接,可以通过IEnumerable的GetEnumerator()得到IEnumerator对象

例子:(引用@RY一步一个脚印)

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Collections;namespace IEnumeratorSample{    class Person : IEnumerable    {        public string Name;//定义Person的名字        public string Age;//定义Person的年龄        public Person(string name, string age)//为Person初始化(构造函数)        {            Name = name;//配置Name值            Age = age;        }        private Person[] per;//Person类型的数组        public Person(Person[] array)//重载构造函数,迭代对象        {            per = new Person[array.Length];//创建对象            for (int i = 0; i < array.Length; i++)//遍历初始化对象            {                per[i] = array[i];//数组赋值            }        }        public IEnumerator GetEnumerator()//实现接口        {            return new PersonEnum(per);//返回一个新的迭代器,是为了维护状态        }    }    class PersonEnum : IEnumerator//实现foreach语句内部,并派生    {        public Person[] _per;//实现数组        int position = -1;//设置“指针”        public PersonEnum(Person[] list)        {            _per = list;//实现list        }        public bool MoveNext()//实现向前移动        {            position++;//位置增加            return (position < _per.Length);//返回布尔值        }        public void Reset()//位置重置        {            position = -1;//重置指针为-1        }        public object Current//实现接口方法        {            get            {                try                {                    return _per[position];//返回对象                }                catch (IndexOutOfRangeException)//捕获异常                {                    throw new InvalidOperationException();//抛出异常信息                }            }        }    }    class Program    {         static void Main(string[] args)        {            Person[] per = new Person[2]            //调用构造函数            {                new Person("guojing","21"),                new Person("muqing","21"),            };            Person personlist = new Person(per);//调用构造函数            foreach (Person p in personlist)//遍历对象            {                Console.WriteLine("Name is " + p.Name + " and Age is " + p.Age);            }            Console.ReadKey();        }    }}
0 0