一、概述
IEnumerator 是所有非泛型枚举器的基接口。 其泛型等效项是 System.Collections.Generic.IEnumerator<T> 接口。
C# 语言的 foreach 语句(在 Visual Basic 中为 for each)隐藏了枚举数的复杂性。 因此,建议使用 foreach 而不是直接操作枚举器。
枚举器可用于读取集合中的数据,但不能用于修改基础集合。
方法 Reset 为实现 COM 互操作性而提供,不需要完全实现;相反,实现者可能会引发 NotSupportedException。
最初,枚举数定位在集合中第一个元素的前面。 在读取 的值Current之前,必须调用 MoveNext 方法以将枚举数推进到集合的第一个元素;否则为Current未定义。
在调用 Current 或 MoveNext 之前,Reset 返回同一对象。 MoveNext 将 Current 设置为下一个元素。
如果 MoveNext 传递集合的末尾,则枚举器位于集合中最后一个元素之后,并 MoveNext 返回 false。 当枚举器位于此位置时,对 MoveNext 的后续调用也会返回 false。 如果最后一次MoveNext调用返回 ,falseCurrent则为未定义。
若要再次设置为Current集合的第一个元素,可以调用 (如果已实现),然后调用 ResetMoveNext。 如果未 Reset 实现 ,则必须创建新的枚举器实例以返回到集合的第一个元素。
如果对集合进行了更改(例如添加、修改或删除元素),则枚举器的行为是不确定的。
枚举数没有对集合的独占访问权;因此,从头到尾对一个集合进行枚举在本质上不是一个线程安全的过程。 即使某个集合已同步,其他线程仍可以修改该集合,这会导致枚举数引发异常。 若要确保枚举过程中的线程安全性,可以在整个枚举期间锁定集合,或者捕获由其他线程进行的更改所导致的异常。
二、用法
IEnumerator 属性只有一个:Current,IEnumerator 方法只有两个,MoveNext 和 Reset。
Current
获取集合中位于枚举数当前位置的元素。
MoveNext()
将枚举数推进到集合的下一个元素,并返回一个布尔值,指示是否成功移动到下一个元素,如果成功移动到下一个元素,则返回 true,否则,返回 false
Reset()
将迭代器重置到集合的起始位置。在调用Reset()方法之后,应该再次调用MoveNext()方法来将迭代器移动到第一个元素。
示例:
using System;
using System.Collections;
class Program
{
static void Main(string[] args)
{
ArrayList list = new ArrayList();
list.Add("Apple");
list.Add("Banana");
list.Add("Orange");
IEnumerator enumerator = list.GetEnumerator();
while (enumerator.MoveNext())
{
string element = (string)enumerator.Current;
Console.WriteLine(element);
}
Console.WriteLine("=============================");
enumerator.Reset();
while (enumerator.MoveNext())
{
string element = (string)enumerator.Current;
Console.WriteLine(element);
}
}
}
运行:
IEnumerator 的本身内容比较少,属性和方法在文章的上面做了详细的介绍,IEnumerator 在我们平时的开发中,用的非常的少,一般情况下,都是用 for、foreach,另外在设计模式中,有一个模式叫 “迭代器模式” 会用到 IEnumerator,总结就是:可以了解了解,不特别推荐使用。
end