先来说说IEnumrable和IEnumrator接口,IEnumrable接口成员如下:
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
IEnumrable是可枚举类型,什么是可枚举类型呢?简单说,就是实现了IEnumrable接口的类型,所有能用foreach循环的类型都是可枚举类型。
可迭代类型,迭代即遍历,可迭代,即可遍历,所以只要一个类型实现了IEnumrable接口,就可以进行对它进行迭代(遍历)。
这个接口只有一个成员GetEnumerator()方法,返回一个IEnumrator接口对象,我们再看看IEnumrator的接口定义:
public interface IEnumerator
{
object Current { get; }
bool MoveNext();
void Reset();
}
IEnumrator枚举器,只有三个成员:只读属性Current,方法Move(),方法Reset()。
Reset()方法将集合游标复位至-1位置,为下一次向前遍历整个集合做准备;
Current只读属性,获取当前游标所在位置的集合元素;
MoveNext()方法,将游标移至下一个集合元素位置,为获取新元素做准备;
如上,IEnumrable接口唯一需要实现的是方法GetEnumerator,该方法返回值是IEnumrator接口类型,接口和类一样,都是引用类型,GetEnumrator方法返回类型是IEnumrator接口,可以返回IEnumrator接口的实现,即继承IEnumrator接口的类,所以这边只要返回一个实现了IEnumrator接口的类的对象就可以了,也就是说返回的类中要实现IEnumrator接口的三个成员:属性Current,方法Move(),方法Reset().(24-04-23)
一般来说有两种方式实现集合类的IEnumrable和IEnumrator接口成员,从而实现对集合类的元素遍历。
第一种,按照.Net集合类的接口实现方式,集合类继承IEnumrable接口并实现GetEnumrator()方法,方法内返回IEnumrator对象,然后创建一个类Enumrator_People,继承IEnumrator接口,实现该接口的三个成员.如下demo:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Windows.Forms;
namespace 自定义集合类
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//People是自定义的集合类型,创建一个集合对象peo,然后将集合元素逐一添加进来,再进行peo集合遍历集合中的元素!
//通过合类的无参构造函数,创建一个空集合对象peo
People peo = new People();
//通过Add方法添加集合元素