您的位置:首页 > 其它

IEnumerator 和IEnumerable,及其泛型

2015-11-07 17:17 302 查看
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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: