简述:
foreach语句是被设计用来和可枚举类型一起使用,只要它的遍历对象是可枚举类型(实现了IEnumerable),比如数组。调用过程如下:
调用GetEnumerator()方法,返回一个IEnumerator引用。
调用返回的IEnumerator接口的MoveNext()方法。
如果MoveNext()方法返回true,就使用IEnumerator接口的Current属性获取对象的一个引用,用于foreach循环。
重复前面两步,直到MoveNext()方法返回false为止,此时循环停止。
1.
void Main()
{
Person person = new Person();
foreach (var item in person)
{
Console.WriteLine(item);
}
var Enumerator = person.GetEnumerator();
while (Enumerator.MoveNext())
{
Console.WriteLine(Enumerator.Current);
}
}
class Person
{
string[] Datas = new string[] { "张三", "李四", "王五" };
public PersonEnumerator GetEnumerator()
{
return new PersonEnumerator(Datas);
}
}
/// <summary>
/// 迭代计数器
/// </summary>
class PersonEnumerator
{
public PersonEnumerator(string[] datas) { this.Datas = datas; }
/// <summary>
/// 遍历的数据对象
/// </summary>
private string[] Datas;
private int index = -1;
/// <summary>
/// 当前遍历到的元素
/// </summary>
public string Current
{
get { return Datas[index]; }
}
/// <summary>
/// 将记录指针移至下一条
/// </summary>
/// <returns>是否存在尚未遍历的元素</returns>
public bool MoveNext()
{
index++;
return index < Datas.Length;
}
}
public class MyCollection : IEnumerable<int>
{
private int[] data = { 1, 2, 3 };
public IEnumerator<int> GetEnumerator()
{
return new MyEnumerator(this);
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
private class MyEnumerator : IEnumerator<int>
{
private MyCollection collection;
private int index = -1;
public MyEnumerator(MyCollection collection)
{
this.collection = collection;
}
public bool MoveNext()
{
index++;
return index < collection.data.Length;
}
public int Current
{
get
{
return collection.data[index];
}
}
object IEnumerator.Current => Current;
public void Reset()
{
index = -1;
}
public void Dispose() { }
}
}