class IterationSample : IEnumerable //框架
{
object[] values;
int startingPoint;
public IterationSample(object[] values, int startingPoint) //主函数调用 一个是 a b c d e , 一个是 3 开始的位置是d
{//设置构造函数的设置值和起点
this.values = values;
this.startingPoint = startingPoint;
}
public IEnumerator GetEnumerator() //collection 迭代器不用一次返回所有的数据 调用一次访问一个元素
{
return new IterationSampleIterator(this);
}
class IterationSampleIterator : IEnumerator //创建另外一个类,让分工明确 嵌套类实现集合迭代器
{
IterationSample parent; //正在迭代的集合
int position; //指出遍历的位置
internal IterationSampleIterator(IterationSample parent) //return new InterationSampleIterator(this)调用
{
this.parent = parent;
position = -1; //position为-1 在第一个元素之前开始
}
public bool MoveNext() //in 调用MoveNext函数
{
if (position != parent.values.Length) //position为-1 length=5 开始为d 后面为e a b c c的时候postion为4
{//如果仍要遍历,增加position的值
position++; //原本值为-1, 返回时position=0 =1 =2 =3 =4 =5
}
return position < parent.values.Length; //postion为0 1 2 3 4 5 true之后true true ture true false
}//false 就跳出循环
public object Current
{
get
{
if (position == -1 || //阻止访问第一个元素之后和最后一个元素之后
position == parent.values.Length)
{
throw new InvalidOperationException();
}
int index = (position + parent.startingPoint); //实现封装 返回元素 对位置进行偏移
index = index % parent.values.Length;
return parent.values[index];
}
}
public void Reset()
{
position = -1; //返回第一个元素之前
}
}
static void Main()
{
object[] values = { "a", "b", "c", "d", "e" };
IterationSample collection = new IterationSample(values, 3);
foreach (object x in collection) //x 为 d e a b c collectino调用GetEnumerator
{
Console.WriteLine(x);
}
}
}
输出
d
e
a
b
c