解释.NET中的迭代器模式
迭代器模式用于遍历集合中的元素,并使用IEnumerator接口实现。它定义了基本的低级协议,通过该协议遍历或枚举集合中的元素。这是以只进的方式完成的。
这是C#中的IEnumerator接口。
public interface IEnumerator{ bool MoveNext(); object Current { get; } void Reset(); }
MoveNext将当前元素或“光标”移动到下一个位置,如果集合中没有更多元素,则返回false。
Current返回当前位置的元素(通常从对象转换为更具体的类型)。MoveNext必须在检索第一个元素之前调用——这是为了允许一个空集合。
该复位方法,如果实现的话,移回开始,允许集合再次列举。
集合通常不实现枚举器;相反,他们通过接口IEnumerable提供枚举器-
public interface IEnumerable{ IEnumerator GetEnumerator(); }
该接口定义了一个返回枚举器的方法。这提供了灵活性,因为可以将迭代逻辑移交给另一个类。这也意味着多个使用者可以一次枚举集合而不会相互干扰。您可以将IEnumerable视为“IEnumeratorProvider”,它是集合类实现的最基本的接口。
以下示例说明了IEnumerable和IEnumerator的低级使用-
示例
string s = "Hello"; //因为string实现了IEnumerable,我们可以调用GetEnumerator(): IEnumerator rator = s.GetEnumerator(); while (rator.MoveNext()){ char c = (char) rator.Current; Console.Write (c + "."); }输出结果
H.e.l.l.o.
但是,很少以这种方式直接调用枚举器上的方法,因为C#提供了一种语法快捷方式:foreach语句。这是使用foreach重写的相同示例-
string s = "Hello"; //String类实现了IEnumerable foreach (char c in s) Console.Write (c + ".");
IEnumerable和IEnumerator
IEnumerator和IEnumerable几乎总是与其扩展的通用版本一起实现-
public interface IEnumerator: IEnumerator, IDisposable{ T Current { get; } } public interface IEnumerable : IEnumerable{ IEnumerator GetEnumerator(); }