C# IEnumerator 用法

IEnumerator是非泛型枚举器的基接口,常用于集合遍历。它提供了Current属性和MoveNext、Reset方法。foreach语句简化了枚举操作,但枚举器不支持修改基础集合。枚举过程中,如果集合被修改,行为将不确定,且枚举不是线程安全的。了解IEnumerator主要用于迭代器模式和集合遍历,实际开发中通常使用foreach代替直接操作枚举器。
摘要由CSDN通过智能技术生成

一、概述

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

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊思宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值