声明一个类实现IEnumerable接口
class MyIEnumerable : IEnumerable {
public IEnumerator GetEnumerator() {
throw new NotImplementedException();
}
}
实现的接口是要求返回一个IEnumerator。即要实现一个迭代器,所以在这个类中实现这个迭代器
class MyIEnumerable : IEnumerable {
public IEnumerator GetEnumerator() {
return new MyIEnumerator();
}
class MyIEnumerator : IEnumerator {
public object Current => throw new NotImplementedException();
public bool MoveNext() {
throw new NotImplementedException();
}
public void Reset() {
throw new NotImplementedException();
}
}
}
要迭代的只能使一组东西,这里假设要求迭代一组整数。
并且要求有个游标//迭代使用,设置在第一个元素前面
所以在MyIEnumerable中创建,并且在构造函数中初始化
private int[] _arrayList;
private int _head;
public MyIEnumerable(int[] arrayList) {
_arrayList = arrayList;
_head = -1;
}
而在MyIEnumerator中,要处理的是MyIEnumerable,所以在构造函数要求传递一个MyIEnumerable参数
private MyIEnumerable _myIEnumerable;
public MyIEnumerator(MyIEnumerable myIEnumerable) {
_myIEnumerable = myIEnumerable;
}
所以在GetEnumerator中创建MyIEnumerator对象的时候,把MyIEnumerable自己本身
传递过去
public IEnumerator GetEnumerator() {
return new MyIEnumerator(this);
}
接下来要实现的是MyIEnumerator中的Current
Current是一个只有Get的属性,需要get的是MyIEnumerable中_arrayList[head]
public object Current
{
get
{
return _myIEnumerable._arrayList[_myIEnumerable._head];
}
}
MoveNext是判断++head有无越界的,如果没有就返回true
public bool MoveNext() {
if (++_myIEnumerable._head<_myIEnumerable._arrayList.Length)
{
return true;
}
else
{
return false;
}
}
Reset是重置head使用的,所以只需要把head重置为-1即可。
创建实例,并且使用foreach遍历,打印1到5
MyIEnumerable myIEnumerable = new MyIEnumerable(new int[] { 1,2,3,4,5});
foreach (var item in myIEnumerable)
{
Console.WriteLine(item);
}