C# IEnumerator枚举器的具体使用

 更新时间:2022年06月23日 10:54:46   作者:霍比特X  
本文主要介绍了C# IEnumerator枚举器的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1、对象只要一个类型实现了IEnumerable接口就能遍历
2、IEnumerator是枚举器,一个接口类,实现MoveNext->Current->Reset
3、yield关键字是一个迭代器,相当于实现了IEnumerator枚举器
4、IEnumerable是可枚举类型,IEnumerator是枚举器

public class IEnumerableShow {
        public void Show() {
            int[] array = { 1, 2, 3, 4, 5 };
            Student student = new Student { Id = 1 };
            foreach (var item in array) {
                Console.WriteLine();
            }
        }
    }

    class Student:IEnumerable { 
        public int Id { get; set; }
        public IEnumerator GetEnumerator() { //返回一个枚举器
            //yield return "Ant编程1";
            //yield return "Ant编程2";
            //yield return "Ant编程3";
            string[] student = { "Ant编程1", "Ant编程2", "Ant编程3" };
            return new StudentEnumerator(student);
        }
    }

    internal class StudentEnumerator : IEnumerator
    {
        string[] _student;
        int _position = -1;
        public StudentEnumerator(string[] student) {
            this._student = student;
        }

        public object Current {
            get {
                if (_position == -1) {
                    throw new InvalidOperationException();
                }
                if (_position>=_student.Length) {
                    throw new InvalidOperationException();
                }
                return _student[_position];
            }
        }

        public bool MoveNext()
        {
            if (_position<_student.Length-1) {
                _position++;
                return true;
            }
            else {
                return false;
            }
        }

        public void Reset()
        {
            _position = -1;
        }
    }

IEnumerator , IEnumerable 枚举器接口

IEnumerator是枚举器的意思,IEnumerable是可枚举的意思。这两个都是个接口

foreach是一种语法糖,用来简化对可枚举元素的遍历代码。而被遍历的类通过实现IEnumerable接口和一个相关的IEnumerator枚举器来实现遍历功能。

public class MyList : IEnumerable
{
    public int[] _data = new int[10] { 1, 5, 7, 9, 7, 8, 7, 8, 7, 4 };
 
    public int this[int index]
    {
        get
        {
            return _data[index];
        }
    }
 
    IEnumerator IEnumerable.GetEnumerator()
    {
        Debug.Log("foreach调用  GetEnumerator");
        return new MIEnumtor(this);
    }
}
public class MIEnumtor : IEnumerator
{
    private MyList myList;
 
    private int index;
 
   public  MIEnumtor(MyList my)
    {
        index = -1;
        myList = my;
    }
 
    public object Current
    {
        get
        {
            Debug.Log("foreach调用  Current");
            return myList[index];
        }
    }
 
    public bool MoveNext()
    {
        Debug.Log("foreach调用  MoveNext");
        if (index < myList._data.Length - 1)
        {
            index++;
            return true;
        }
        index = -1;
        return false;
    }
 
    public void Reset()
    {
 
    }
}

GetIEnumerator()负责获取枚举器。
MoveNext()负责让Current获取下一个值,并判断遍历是否结束。
Current负责返回当前指向的值。
Rest()负责重置枚举器的状态(在foreach中没有用到)
这些就是IEnumerable,IEnumerator的基本工作原理了。

        MyList my = new MyList();
 
        foreach (var item in my)
        {
            Debug.Log(item);
        }

等价于

        MyList my = new MyList();
 
        MIEnumtor mIEnumtor = my.GetEnumerator();
 
        while (mIEnumtor.MoveNext())
        {
            Debug.Log(mIEnumtor.Current);
        }

到此这篇关于C# IEnumerator枚举器的具体使用的文章就介绍到这了,更多相关C# IEnumerator枚举器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#中后台post请求常用的两种方式总结

    C#中后台post请求常用的两种方式总结

    这篇文章主要介绍了C#中后台post请求常用的两种方式总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 使用C#在Excel工作表中查找与替换数据的操作指南

    使用C#在Excel工作表中查找与替换数据的操作指南

    在日常业务中,Excel 常用于保存产品清单、客户信息、销售记录等结构化数据,本文将介绍如何使用 C# 在 Excel 中高效完成查找与替换操作,并结合一个实际业务场景表格数据进行演示,示例涵盖从加载文件、查找目标数据到替换与保存完整流程,需要的朋友可以参考下
    2025-11-11
  • C#利用栈实现加减乘除运算

    C#利用栈实现加减乘除运算

    这篇文章主要介绍了C#利用栈实现加减乘除运算的实现方法,需要的朋友可以参考下
    2019-11-11
  • C#实现Quartz任务调度的示例代码

    C#实现Quartz任务调度的示例代码

    使用 Quartz.NET,你可以很容易地安排任务在应用程序启动时运行,或者每天、每周、每月的特定时间运行,甚至可以基于更复杂的调度规则,本文给大家介绍了C#实现Quartz任务调度,需要的朋友可以参考下
    2024-04-04
  • WPF实现基础控件之托盘的示例代码

    WPF实现基础控件之托盘的示例代码

    这篇文章主要为大家详细介绍了如何利用WPF实现托盘这一基础控件,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
    2022-10-10
  • c#判断网络连接状态的示例分享

    c#判断网络连接状态的示例分享

    这篇文章主要介绍了使用c#判断网络连接状态的示例,需要的朋友可以参考下
    2014-02-02
  • c# 动态构建LINQ查询表达式

    c# 动态构建LINQ查询表达式

    这篇文章主要介绍了c# 如何动态构建LINQ查询表达式,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-11-11
  • C#日期格式字符串的相互转换操作实例分析

    C#日期格式字符串的相互转换操作实例分析

    这篇文章主要介绍了C#日期格式字符串的相互转换操作,结合实例形式分析了C#日期格式字符串的相互转换操作函数与相关使用技巧,需要的朋友可以参考下
    2019-08-08
  • Unity Blend Tree动画混合树使用入门教程

    Unity Blend Tree动画混合树使用入门教程

    这篇文章主要为大家详细介绍了Unity Blend Tree动画混合树使用入门教程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C#中三种Timer计时器的详细用法

    C#中三种Timer计时器的详细用法

    这篇文章介绍了C#中三种Timer计时器的详细用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05

最新评论