IEnumberator函数成员
- Current返回序列中当前位置项的 属性
- 只读属性
- 返回object类型
- MoveNext把枚举器位置前进到集合中下一项的方法
- 新位置有效返回true,否则false
- 枚举器原始位置在序列第一项前面,所以如果要用Current必须先用MoveNext()
- Reset枚举器位置重置为初始位置
IEnumerable接口函数成员
该接口只有一个方法GetEnumerator()
IEnumerable和 IEnumberator使用范例
一个具有IEnumberable的类
Class ColorEnumerator:IEnumerator { string [] _colors; ; //构造函数,把传入数组保存到_colors中 public ColorEnumerator(string[] theColors) { _colors=new string[thisColors.Length]; ;i<theColors.Length;i++) { _colors[i]=theColors[i]; } } //实现接口 public object Current { get { //异常处理 ||_position>=_color.Length) throw new InvalidOperationException(); return _colors[_position]; } } public bool MoveNext() { ) { _position++;return true; }else return false; } public void Reset() { _position=-; } } //继承自定义枚举器 Class Mycolors: ColorEnumerator { string[] Colors={"Red","Yellow","Blue"}; //实现IEnumerable接口返回Colors数组的迭代器类(实现了IEnumerator的类) //这个迭代器是自定义的 public IEnumbertor GetEnumbertor() { return new ColorEnumerator(Colors); } } class Program { static void Main() { Mycolors colors=new Mycolors(); foreach(string c in colors) { Console.WriteLine(c); } } }
泛型枚举接口
最主要区别:
泛型:
IEnumerable GetEnumerator获得的IEnumator是T类型的,IEnumator<T>用Current获得的不是object了,而是T类型的
IEnumerator<T>反编译
public interface IEnumerator<out T> : IDisposable, IEnumerator { T Current { get; } }
实现IEnumerator<T>需要实现T Current属性,IEnumerator中的object Current和其余两个方法
还有要实现IDisposable
IEnumerator<T>反编译
publicinterfaceIEnumerable<out T>:IEnumerable { IEnumerator<T>GetEnumerator(); }
IEnumerator非泛型类返回值已经定死为object
如果要实现泛型,则把IEnumerator非泛型放在IEnumerator泛型中,它有一个Current,这个能把数据变成指定类型。