C# 枚举器和迭代器(常见迭代器模式)

常见迭代器模式

前面两节的内容显示了我们可以创建迭代器来返回可枚举类型或枚举器。图19-11总结了如

何使用常见的迭代器模式。

  • 当我们实现返回枚举器的迭代器时,必须通过实现GetEnumerator来让类可枚举,它返回
    由迭代器返回的枚举器,如图19-11中左半部分所示。
  • 在类中实现返回可枚举类型的迭代器时,我们可以让类实现GetEnumerator来让类本身可
    枚举,或不实现GetEnumerator,让类不可枚举。
    • 如果实现GetEnumerator,让它调用迭代器方法以获取自动生成的实现1Enumerab1e
      的类实例。然后,从iFnumerab1e对象返回由GetEnumerator创建的枚举器,如图19-11
      右边所示。
    • 如果通过不实现GetEnumerator使类本身不可枚举,仍然可以使用由迭代器返回的可枚
      举类,只需要直接调用迭代器方法,如图19-11中右边第二个foreach语句所示。

产生多个可枚举类型

在下面的示例中,spectrurn类有两个可枚举类型的迭代器------ 一个从紫外线到红外线枚举光

谱中的颜色,而另一个以逆序进行枚举。注意,尽管它有两个方法返回可枚举类型,但类本身不

是可枚举类型,因为它没有实现GetEnumerator。

csharp 复制代码
using System;
using System.Collecions.Generic;

class Spectrum
{
    string[] colors={"violet","blue","cyan","green","yellow","orange","red"};

    public IEnumerable<string>UVtoIR()
    {
        for(int i=0;i<colors.Length;i++)
            yield return colors[i];
    }

    public IEnumerable<string>IRtoUV()
    {
        for(int i=colors.Length-1;i>=0;i--)
            yield return colors[i];
        Console.WriteLine();

        foreach(string color in Spectrum.IRtoUV())
            Console.Write($"{color}");
        Console.WriteLine();
    }
}
相关推荐
疯狂的Alex18 小时前
【C#避坑实战系列文章15】C# WinForm 上位机开发:解决串口粘包+LiveCharts卡顿+InfluxDB存储(免费代码+仿真工具)
sqlite·c#·上位机·串口通信·livechars·c#硬件对接
java水泥工19 小时前
网上摄影工作室|基于SpringBoot和Vue的网上摄影工作室(源码+数据库+文档)
数据库·vue.js·spring boot
jingfeng51419 小时前
MySQL库的操作(ubuntu)
数据库·mysql
奔跑吧邓邓子19 小时前
【C++实战(64)】C++ 邂逅SQLite3:数据库编程实战之旅
数据库·c++·sqlite·实战·sqlite3·数据库编程
Tony Bai1 天前
【Go开发者的数据库设计之道】07 诊断篇:SQL 性能诊断与问题排查
开发语言·数据库·后端·sql·golang
cpsvps_net1 天前
VPS服务器锁等待超时处理,如何有效解决数据库性能瓶颈
服务器·数据库·oracle
文火冰糖的硅基工坊1 天前
[创业之路-653]:社会产品与服务的分类
大数据·数据库·人工智能
235161 天前
【MySQL】数据库事务深度解析:从四大特性到隔离级别的实现逻辑
java·数据库·后端·mysql·java-ee
脚踏实地的大梦想家1 天前
【LangChain】P7 对话记忆完全指南:从原理到实战(下)
数据库·langchain
conkl1 天前
Flask 与 MySQL 数据库集成:完整的 RESTful API 实现指南
数据库·mysql·flask