C#语言进阶(四) 枚举器和迭代器

总目录
C# 语法总目录

枚举器和迭代器

  • 枚举器和迭代器
    • 1. 枚举器
    • 2. 可枚举对象
    • 3. 迭代器
    • 4. 迭代器语义
    • 5. yield break 语句
    • 6. 组合序列

枚举器和迭代器

1. 枚举器

枚举器(Enumerator)是一个只读的且只能在值序列上前移的游标。

任何具有MoveNext方法和Current属性的对象都被称作枚举器。

枚举器实现了下面的接口之一:

  • System.Collections.IEnumerator

  • System.Collections.Generic.IEnumerator

2. 可枚举对象

可枚举对象(Enumerable),它可以生成枚举器。

可枚举的对象可以是:

  • IEnumerable 或 IEnumerable的实现。

  • 具有名为GetEnumerator 的方法并且返回值是一个枚举器 (Enumerator)对象

注意:IEnumerator 和 IEnumerable 定义在 System.Collections 里。

​ IEnumerator 和 IEnumerable 定义在 System.Collections.Generic 里。

//枚举器模板
class Enumerator
{
    public IteratorVariableType Current{ get{...}}
    public bool MoveNext(){...}
}
//可枚举类型模版
class Enumerable
{
    public Enumerator GetEnumerator(){...}
}

3. 迭代器

迭代器是枚举器的生产者。foreach语句是枚举器的消费者。

案例:使用迭代器来返回斐波那契数列(每个数字是前两个数字之和)

using System;
using System.Collections.Generic;
class Test
{
    static void Main()
    {
        foreach(int fib in Fibs(6))
            Console.Write(fib+" ");
    }
    //迭代器方法
    static IEnumerable<int> Fibs(int fibCount)
    {
        for(int i =0,prevFib =1,curFib=1;i<fibCount;i++)
        {
            yield return prevFib;
            int newFib = prevFib+curFib;
            prevFib = curFib;
            curFib = newFib;
        }
    }
}

//输出
1 1 2 3 5 8

4. 迭代器语义

迭代器是包含一个或者多个 yield 语句的方法,属性或者索引器。

//迭代器必须返回以下四个接口之一(否则编译器会产生相应错误):
//可枚举接口
System.Collections.IEnumerable
System.Collections.Generic.IEnumerable<T>

//枚举器接口
System.Collections.IEnumerator
System.Collections.Generic.IEnumerator<T>
    
    
    
//多个yield语句
class Test
{
    static void Main()
    {
        foreach(string s in Foo())
            Console.WriteLine(s);	//输出 One,Two,Three
    }
    static IEnumerable<string> Foo()
    {
        yield return "One";
        yield return "Two";
        yield return "Three";
    }
}

5. yield break 语句

yield break 语句表明迭代器块不再返回更多的元素,而是提前退出。

static IEnumerable<string> Foo(bool breakEarly)
{
    yield return "One";
    yield return "Two";
    if(breakEarly)
        yield break;			//到这里就退出了
    yield return "Three";
}

注意:yield return 语句不能出现在 try…catch…finally 块中,只能出现在try…finally中try块里面。

通常使用foreach或隐式销毁枚举器,但是如果显示使用枚举器,提前结束枚举而不销毁枚举器,绕过了finally块的执行。那么我们可以将枚举器显式包裹在using语句中来避免上述错误。

string firstElement = null;
var sequence = Foo();
using(var enumerator = sequence.GetEnumerator())	//使用using,会自动关闭一个持续流
    if(enumerator.MoveNext())
        firstElement = enumerator.Current;

6. 组合序列

迭代器有高度可组合性。迭代器模式的组合对LINQ非常重要。

class Program
{
    static void Main(string[] args)
    {
        foreach (int fib in EvenNumbersOnly(Fibs(6)))
        {
            Console.WriteLine(fib);
        }
    }
    static IEnumerable<int> Fibs(int fibCount)
    {
        for (int i = 0,prevFib = 1,curFib =1;  i<fibCount; i++)
        {
            yield return prevFib;
            int newFib = prevFib + curFib;
            prevFib = curFib;
            curFib = newFib;
        }
    }

    static IEnumerable<int> EvenNumbersOnly(IEnumerable<int> sequence)
    {
        foreach (int x in sequence)
        {
            if ((x % 2) ==0)
            {
                yield return x;
            }
        }
    }
}

总目录
C# 语法总目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/601816.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python Flask框架(一)初识Flask

Flask是使用Python编写的Web微框架。Web框架可以使我们不用关心底层的请求响应处理&#xff0c;更方便高效的编写Web程序。Flask有两个主要依赖&#xff0c;一个是WSGI&#xff08;Web Server Gateway Interface&#xff0c;web服务器网关接口&#xff09;工具集&#xff0c;另…

ansible——INVENTORY主机清单

一、Inventory主机清单 Inventory支持对主机进行分组&#xff0c;每个组内可以定义多个主机&#xff0c;每个主机都可以定义在任何一个或多个主机组内 二、Inventory主机清单部署 2.1 前期准备 systemctl stop firewalld setenforce 0 yum install epel-release -y yum install…

Python实战点云并行化处理

LAS 及其压缩版本 LAZ 是用于存储点云信息的流行文件格式&#xff0c;通常由 LiDAR 技术生成。 LiDAR&#xff08;即光探测和测距&#xff09;是一种遥感技术&#xff0c;用于测量距离并创建物体和景观的高精度 3D 地图。存储的点云信息主要包括X、Y、Z坐标、强度、颜色、特征分…

接入大量设备后,视频汇聚系统EasyCVR安防监控视频融合平台是如何实现负载均衡的?

一、负载均衡 随着技术的不断进步和监控需求的日益增长&#xff0c;企业视频监控系统的规模也在不断扩大&#xff0c;接入大量监控设备已成为一项常态化的挑战。为确保企业能够有效应对这一挑战&#xff0c;视频汇聚系统EasyCVR视频融合平台凭借其卓越的高并发处理能力&#x…

c++11 标准模板(STL)本地化库 - 平面类别(std::numpunct) - 定义数值标点规则

本地化库 本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析&#xff0c;以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C 标准库的其他组件的行为。 平面类别 定义数值标点规则 std::numpunct template< class CharT >…

浅谈程序员的实用神器

作为一个程序员&#xff0c;有很多实用的工具和资源可以帮助我们提高工作效率和解决问题。以下是一些常用的程序员实用神器&#xff1a; 集成开发环境&#xff08;IDE&#xff09;&#xff1a;如Visual Studio Code、PyCharm、Eclipse等&#xff0c;提供代码编辑、调试、版本控…

APP 在华为应用市场上架 保姆级别详细流程

1、作为一名干开发的程序员&#xff0c;第一次能把自己的APP 上架&#xff0c;对自己来说是多么有意义的一项成就 2、创建一个 华为的开发者账号 根据提示填写完注册的信息https://developer.huawei.com/consumer/cn/product/华为开发者产品 | 开发者平台 | 流量变现 | 华为开…

虾皮商品详情页面的API接口与关键词搜索API接口

虾皮商品详情页面的API接口与关键词搜索API接口 在虾皮&#xff08;Shopee&#xff09;这样的电商平台中&#xff0c;API&#xff08;应用程序接口&#xff09;扮演着至关重要的角色&#xff0c;它们为开发者提供了与虾皮平台数据交互的桥梁。本文将详细介绍虾皮商品详情页面的…

GreatSQL的sp中添加新的sp_instr引入的bug解析

GreatSQL的sp中添加新的sp_instr引入的bug解析 一、问题发现 在一次开发中用到的sp需要添加新的sp_instr以满足需求&#xff0c;但是添加了数个sp_instr以后发现执行新的sp会发生core。 注&#xff1a;本次使用的GreatSQL 8.0.32-25 1、sp_head.cc的init_sp_psi_keys()代码里…

阿贝云免费服务器推荐

由于近期毕设需要&#xff0c;需要将毕设上传到云服务器&#xff0c;届时答辩方便展示&#xff0c;找了很多云服务器提供商&#xff0c;发现都是需要抢或者其他要求的&#xff0c;无意中从一个知乎帖子中发现了阿贝云&#xff0c;号称永久免费&#xff0c;兴冲冲的开始免费适用…

网络补充笔记

目录 OSI 开放式系统互联参考模型 --- 7层参考模型 UDP&#xff1a;用户数据报文协议 --- 非面向不可靠的传输协议&#xff1b;传输层基本协议&#xff0c;仅完成传输层的基本工作 --- 分段、端口号 TCP&#xff1a;传输控制协议 --- 面向连接的可靠性传输协议 出了完成传输层…

Express初体验

介绍 Express是一个基于Node.js平台的极简、灵活的Web应用开发框架&#xff0c;官方地址&#xff1a;https://www.expressjs.com.cn/&#xff0c;简单来说&#xff0c;Express是一个封装好的工具包&#xff0c;封装了很多功能&#xff0c;便于我们开发Web应用&#xff08;HTTP…

提升Go语言数学运算能力:math包使用指南

提升Go语言数学运算能力&#xff1a;math包使用指南 介绍数学函数的使用基本数学运算幂和根的计算三角函数对数计算 特殊数学常数和函数数学常数超越数学函数错误处理和精度问题 高级应用实例统计数据的标准偏差计算利用三角函数解决实际问题 性能优化技巧避免不必要的函数调用…

机器学习——4.案例: 简单线性回归求解

案例目的 寻找一个良好的函数表达式,该函数表达式能够很好的描述上面数据点的分布&#xff0c;即对上面数据点进行拟合。 求解逻辑步骤 使用Sklearn生成数据集定义线性模型定义损失函数定义优化器定义模型训练方法&#xff08;正向传播、计算损失、反向传播、梯度清空&#…

计算机系列之数据结构

19、数据结构&#xff08;重点、考点&#xff09; 1、线性结构 线性结构&#xff1a;每个元素最多只有一个出度和一个入读&#xff0c;表现为一条线状。线性表按存储方式分为顺序表和链表。 1、顺序存储和链式存储 存储结构&#xff1a; 顺序存储&#xff1a;用一组地址连续…

【功耗仪使用】

一&#xff0c;功耗仪使用 1.1&#xff0c;功耗仪外观及与手机&#xff0c;电脑连接方式 power monitor设备图 同时power monitor设备的后端有一个方形插孔通过数据线与电脑主机USB接口相连接&#xff0c;圆形插孔为电源插孔&#xff0c;用来给power monitor设备通电 pow…

图算法必备指南:《图算法:行业应用与实践》全面解读,解锁主流图算法奥秘!

《图算法&#xff1a;行业应用与实践》于近日正式与读者见面了&#xff01; 该书详解6大类20余种经典的图算法的原理、复杂度、参数及应用&#xff0c;旨在帮助读者在分析和处理各种复杂的数据关系时能更好地得其法、善其事、尽其能。 全书共分为10章&#xff1a; 第1~3章主要…

FFmpeg 音视频处理工具三剑客(ffmpeg、ffprobe、ffplay)

【导读】FFmpeg 是一个完整的跨平台音视频解决方案&#xff0c;它可以用于音频和视频的转码、转封装、转推流、录制、流化处理等应用场景。FFmpeg 在音视频领域享有盛誉&#xff0c;号称音视频界的瑞士军刀。同时&#xff0c;FFmpeg 有三大利器是我们应该清楚的&#xff0c;它们…

idea Maven 插件 项目多环境打包配置

背景 不同环境的配置文件不一样&#xff0c;打包方式也有差异 1. 准备配置文件 这里 local 为本地开发环境 可改为 dev 名称自定义 test 为测试环境 prod 为生产环境 根据项目业务自行定义 application.yml 配置&#xff1a; spring:profiles:#对应pom中的配置active: spring.…

二分图(染色法与匈牙利算法)

二分图当且仅当一个图中不含奇数环 1.染色法 简单来说&#xff0c;将顶点分成两类&#xff0c;边只存在于不同类顶点之间&#xff0c;同类顶点之间没有边。 e.g. 如果判断一个图是不是二分图&#xff1f; 开始对任意一未染色的顶点染色。 判断其相邻的顶点中&#xff0c;若未…
最新文章