C#【进阶】迭代器

迭代器

文章目录

      • 1、迭代器概念
      • 2、标准迭代器的实现方法
      • [3、用yield return 语法糖实现迭代器](#3、用yield return 语法糖实现迭代器)
      • [4、用yield return 语法糖为泛型类实现迭代器](#4、用yield return 语法糖为泛型类实现迭代器)

1、迭代器概念

c 复制代码
迭代器(iterator) 又称光标(cursor)
是程序设计的软件设计模式
迭代器提供一个方法顺序访问一个聚合对象中的各个元素
而又不暴露其内部的标识

在表现效果上看
是可以在容器对象(例如链表或数组)上遍历访问的接口
设计人员无需关心容器对象的内存分配的实现细节
可以用foreach遍历的类,都是实现了迭代器的

2、标准迭代器的实现方法

csharp 复制代码
继承IEnumerable, IEnumerator
using System.Collections;

CustomList lists = new CustomList();
//foreach本质
//1、先获取in后面这个对象的IEnumerator
//会调用对象其中的GetEnumerator方法来获取
//2、执行得到这个IEnumerator对象中的MoveNext方法
//3、只要MoveNext方法的返回值是true,就会去得到Current
//然后赋值给item
foreach (var item in lists)
{
    Console.WriteLine(item);
}

class CustomList : IEnumerable, IEnumerator
{
    private int position = -1;
    private int[] list;
    public CustomList()
    {
        list = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 };
    }

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

    public IEnumerator GetEnumerator()
    {
        Reset();
        return this;
    }

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

    //reset重置光标位置,写在IEnumerator中
    public void Reset()
    {
        position = -1;
    }
}

3、用yield return 语法糖实现迭代器

csharp 复制代码
yield return 是C#提供的语法糖
语法糖主要作用就是将复杂逻辑简单化,可以增加程序的可读性
    
CustomList list = new CustomList();
foreach (var item in list)
{
Console.WriteLine(item);
}
class CustomList : IEnumerable
{
    private int[] list;
    public CustomList()
    {
        list = new int[] { 1, 2, 3 };
    }
    public IEnumerator GetEnumerator()
    {
        for (int i = 0; i < list.Length; i++)
        {
            //配合迭代器使用
            yield return list[i];
        }
    }
}

4、用yield return 语法糖为泛型类实现迭代器

csharp 复制代码
CustomList<string> array = new CustomList<string>("aaa","bbb","ccc");
foreach (var item in array)
{
    Console.WriteLine(item);
}
class CustomList<T> : IEnumerable
{
    private T[] array;
    public CustomList(params T[] array)
    {
        this.array = array;
    }
    public IEnumerator GetEnumerator()
    {
        for (int i = 0; i < array.Length; i++)
        {
            yield return array[i];
        }
    }
}
相关推荐
§ꦿCFོ༉6 小时前
嵌入式八股文—C语言入门学习(四)
c语言·开发语言·学习
投图匠7 小时前
十种不同风格的 CTP接口 框架
开发语言·python
爱笑的k1110 小时前
nano-vllm 源码剖析:千行 Python 手写离线推理引擎的调度、显存与并行时序
开发语言·python·vllm
用户37215742613510 小时前
C# 提取 PDF 附件:包括文档附件和页面注释附件
c#
寂寞的船11 小时前
【Unity Bug挑战】第12期 Awaitable 二次 await 死锁之谜 —— 为什么同一个异步操作等两次就卡死?
unity·c#·游戏引擎·bug
X1A0RAN11 小时前
PPT 图片批量处理教程:导出全部幻灯片 · 提取全部素材
开发语言·javascript·powerpoint
熊猫钓鱼>_>12 小时前
普通用户视角的端侧智能体验手记【鸿蒙心迹】
开发语言·人工智能·华为·智能手机·性能优化·ai编程·harmonyos
瑞雪兆丰年兮12 小时前
JavaWeb-day13-SpringBootWeb事务管理&AOP
java·开发语言·springboot·javaweb·事务·web·aop
布莱克60514 小时前
Swift 常量详解:从 let 到编译期优化
服务器·开发语言·ssh·swift·常量·let
布莱克60514 小时前
Swift 可选类型(Optionals)详解:从原理到实战
开发语言·安全·ssh·swift·optional·可选类型