对集合 (通常是数组或列表) 执行的最常见的操作之一就是遍历(迭代)它的所有元素。为此,最简单的办法就是使用 foreach 语句。在C#1中,为了使用 foreach,集合要么必须实现
System.Collections.IEnumerable 接口,要么必须有一个类似于返回一个类型的 GetEnumerator() 方法,而且该类型含有一个恰当的 MoveNext() 方法和 Current 属性。
C#2 的改进。foreach 语句的规则得到了扩展,现在还可以使用 system.Collections.Generic.IEnumerable<T> 接口及其搭档 IEnumerator<T>。 它们是旧的枚举接口的泛型等价物,而且应该优先使用它们,而不是使用非泛型的版本。
在少数情况下,当需要为自己的某个类型实现迭代时,你会发现由于 IEnumerable<T> 扩展了旧的 IEnumerable 接口,所以需要实现两个不同的方法:
- IEnumerator<T> GetEnumerator();
- IEnumerator GetEnumerator();
实现 IEnumerable<int>
class CountingEnumerable : IEnumerable<int>
{
public IEnumerator<int> GetEnumerator() // 隐式实现 IEnumerator<int>
{
return new CountingEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() // 显式实现 IEnumerable
{
return GetEnumerator();
}
}
实现 IEnumerator<int>
class CountingEnumerator : IEnumerator<int>
{
int current = -1;
public bool MoveNext()
{
current++;
return current < 10;
}
public int Current { get { return current; } } // 隐式实现 IEnumerator<int>.Current
object IEnumerator.Current { get { return current; } } // 显式实现 IEnumerator.Current
public void Reset()
{
current = -1;
}
public void Dispose() { }
}