C#学习相关系列之自定义遍历器

在C#中,自定义遍历器需要实现IEnumerable接口和IEnumerator接口。其中,IEnumerable接口包含一个GetEnumerator方法,该方法返回一个IEnumerator接口的实例,而IEnumerator接口包含Current、MoveNext和Reset方法。

IEnumerable:IEnumerable是一个接口,它代表一个可以迭代的集合。这意味着可以使用IEnumerator:foreach循环遍历IEnumerable对象中的元素。

在C#中,IEnumerator是.NET框架中的一个接口,它用于在集合中遍历元素。这个接口通常与使用foreach循环来遍历集合的代码一起使用。

IEnumerator接口定义了两个主要的方法:MoveNext()Reset()

  • MoveNext()方法用于将迭代器移动到集合中的下一个元素。如果集合中没有更多的元素,则该方法将返回false
  • Reset()方法用于重置迭代器,使其重新回到集合的起始位置。

此外,IEnumerator接口还定义了一个Current属性,它返回当前迭代器位置的元素。

一、yield关键字生成迭代器

cs 复制代码
using System;  
using System.Collections.Generic;  
  
class Program  
{  
    static void Main()  
    {  
        foreach (int number in GetNumbers())  
        {  
            Console.WriteLine(number);  
        }  
    }  
  
    static IEnumerable<int> GetNumbers()  
    {  
        for (int i = 0; i < 10; i++)  
        {  
            yield return i;  
        }  
    }  
}

只有IEnumerable才能通过foreach被遍历。

二、关于**IEnumerator的用法示例**

cs 复制代码
List<string> fruits = new List<string> { "Apple", "Banana", "Cherry" };  
  
IEnumerator enumerator = fruits.GetEnumerator();  
  
while (enumerator.MoveNext())  
{  
    string fruit = (string)enumerator.Current;  
    Console.WriteLine(fruit);  
}

通过这个例子可以看出来 IEnumerable是一个可以迭代的集合,而**IEnumerator是定义foreach迭代器。**

三、自定义一可以遍历的类

cs 复制代码
 public class Program
    {
        static void Main(string[] args)
        {
            student st = new student();
            st.add(2);
            st.add(3);
            st.add(100);
            foreach (var item in st)
            {
                Console.WriteLine(item);
            }
            Console.Read();
        }
    }
    public class student : IEnumerable, IEnumerator

    {
        private List<int> _data;
        private int position = -1;
        private List<int> data = new List<int>();
        public student()
        { 
        }
        public student(List<int> data)
        {
            this._data = data;
        }

        public object Current => _data[position];

        public void add(int num)
        {
            data.Add(num);
        }
        public IEnumerator GetEnumerator()
        {
            return new student(data);
        }

        public bool MoveNext()
        {
            position++;
            return position < _data.Count;
        }

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

代码2

cs 复制代码
using System;
using System.Collections;

public class MyList : IEnumerable
{
    private int[] data = { 1, 2, 3, 4, 5 };

    public IEnumerator GetEnumerator()
    {
        return new MyEnumerator(data);
    }
}

public class MyEnumerator : IEnumerator
{
    private int[] data;
    private int position = -1;

    public MyEnumerator(int[] data)
    {
        this.data = data;
    }

    public object Current
    {
        get
        {
            return data[position];
        }
    }

    public bool MoveNext()
    {
        position++;
        return (position < data.Length);
    }

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

// 使用自定义遍历器
class Program
{
    static void Main(string[] args)
    {
        MyList list = new MyList();
        foreach (int i in list)
        {
            Console.WriteLine(i);
        }
    }
}
相关推荐
好奇龙猫4 小时前
【人工智能学习-AI入试相关题目练习-第七次】
人工智能·学习
jacGJ7 小时前
记录学习--文件读写
java·前端·学习
哈哈不让取名字7 小时前
基于C++的爬虫框架
开发语言·c++·算法
花间相见7 小时前
【JAVA开发】—— Nginx服务器
java·开发语言·nginx
初级代码游戏8 小时前
C#:程序发布的大小控制 裁剪 压缩
c#·.net·dotnet·压缩·大小·发布·裁剪
扶苏-su8 小时前
Java---Properties 类
java·开发语言
枷锁—sha8 小时前
【PortSwigger Academy】SQL 注入绕过登录 (Login Bypass)
数据库·sql·学习·安全·网络安全
魔芋红茶9 小时前
Spring Security 学习笔记 2:架构
笔记·学习·spring
一条咸鱼_SaltyFish9 小时前
远程鉴权中心设计:HTTP 与 gRPC 的技术决策与实践
开发语言·网络·网络协议·程序人生·http·开源软件·个人开发
我即将远走丶或许也能高飞9 小时前
vuex 和 pinia 的学习使用
开发语言·前端·javascript