C# IEnumerator 用法

一、概述

IEnumerator 是所有非泛型枚举器的基接口。 其泛型等效项是 System.Collections.Generic.IEnumerator 接口。

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);
        }
    }
}

运行:

C# IEnumerator 用法_第1张图片

IEnumerator 的本身内容比较少,属性和方法在文章的上面做了详细的介绍,IEnumerator 在我们平时的开发中,用的非常的少,一般情况下,都是用 for、foreach,另外在设计模式中,有一个模式叫 “迭代器模式” 会用到 IEnumerator,总结就是:可以了解了解,不特别推荐使用。

end

你可能感兴趣的:(C#,c#)