当前位置: 首页 > article >正文

C#—内建接口: IEnumerable与IEnumerator接口详解

IEnumerable接口

在C#中,IEnumerable 是一个泛型接口,它表示一个可以通过 IEnumerator 迭代器进行迭代枚举的集合。这个接口是非常基础且重要的,因为它允许开发者以一致的方式遍历任何实现了该接口的集合,无论是数组、列表、自定义集合还是LINQ查询的结果。

IEnumerable是可迭代类型,只要一个类型实现了IEnumerable接口 那么就可以对它进行遍历。

实现IEnumerable接口

yield关键字 : 迭代器(相当于实现了IEnumerator枚举器)

在遍历Student对象时通过类中GetEnumerator方法向外部返回元素。

// 实现
class Student:System.Collections.IEnumerable
{
    public int Id { get; set; }

    public IEnumerator GetEnumerator()
    {
        yield return "学生1";
        yield return "学生2";
        yield return "学生3";
    }
}
// 使用
public class IEnumerableShow
{
    public void Show()
    {
        Student student = new Student();
        foreach (var item in student) // 进行迭代
        {
            Console.WriteLine(item);
        }
        // 第一次打印学生1,第二次打印学生2,第三次打印学生3。
    }
}


IEnumerator接口

IEnumerator 是一个用于迭代集合对象(如列表和数组)的接口。它提供了用于访问对象集合的元素的方法。

IEnumerable和IEnumerator接口搭配使用:

在遍历Student对象时通过Student类中GetEnumerator方法,对StudentEnumerator类进行实例,并触发遍历。

// 第一步:实现IEnumerable接口
class Student:System.Collections.IEnumerable
{
    public int Id { get; set; }

    public IEnumerator GetEnumerator()
    {
        string[] student = { "学生1" , "学生2", "学生3"};
        return new StudentEnumerator(student); // 实例StudentEnumerator类,并通过构造向类中数组赋值
    }
}

// 第二步: 实现 IEnumerator接口
internal class StudentEnumerator : IEnumerator
{
    private string[] _student;
    int _position = -1;
    public StudentEnumerator(string[] student)
    {
        this._student = student;
    }

    public object Current // 获取集合中位于当前枚举的元素
    {
        get 
        { 
            if (_position == -1 ||  _position >= _student.Length)
            {
                throw new InvalidOperationException();
            }
            return _student[_position];
        }
    }

    public bool MoveNext() // 把操作推进到下一个
    {
        if ( _position < _student.Length-1)
        {
            _position++;
            return true;
        }
        return false;
    }

    public void Reset() // 将枚举数设为初始数据
    {
        _position = -1;
    }
}
// 第三步: 使用
public class IEnumerableShow
{
    public void Show()
    {
        int[] array = { 1, 2, 3, 4, 5, };
        Student student = new Student() { Id = 1 };
        foreach (var item in student)
        {
            Console.WriteLine(item);
        }
    }
}


http://www.kler.cn/a/450400.html

相关文章:

  • Selenium 和 Playwright两大框架的不同之处
  • 有没有检测吸烟的软件 ai视频检测分析厂区抽烟报警#Python
  • 对javascript语言标准函数与箭头函数中this的理解(补充)
  • 安宝特应用 | 美国OSHA扩展Vuzix AR眼镜应用,强化劳动安全与效率
  • SSD目标检测算法
  • 项目代码第6讲:UpdownController.cs;理解 工艺/工序 流程、机台信息;前端的“历史 警报/工艺 记录”
  • 如何高效运营OZON:从基础搭建到运营策略
  • 【聊天室后端服务器开发】 入口网关开发
  • Hadoop组成概述
  • 循环和迭代
  • 合同尾款产生纠纷该如何处理
  • 京东科技基于 Apache SeaTunnel 复杂场景适配 #数据集成
  • 深度分析 es multi_match 中most_fields、best_fields、cross_fields区别
  • 用于管理Unity中UGUI的工具系统UISystem
  • Bootstrap 5 加载效果
  • python学opencv读取图像(十四)BGR图像和HSV图像通道拆分
  • Vision Pro开发实现系统UI风格 毛玻璃效果
  • |-牛式-|
  • WebRTC学习二:WebRTC音视频数据采集
  • ChatGPT与Postman协作完成接口测试(二)
  • 1 SpringBoot——项目搭建
  • Web 第一次作业 初探html 使用VSCode工具开发
  • 后端-redis
  • Git远程仓库的使用
  • 【唐叔学算法】第21天:超越比较-计数排序、桶排序与基数排序的Java实践及性能剖析
  • 探索数据可视化的利器:Matplotlib