C#【进阶】迭代器

迭代器

在这里插入图片描述

文章目录

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

1、迭代器概念

迭代器(iterator) 又称光标(cursor)
是程序设计的软件设计模式
迭代器提供一个方法顺序访问一个聚合对象中的各个元素
而又不暴露其内部的标识在表现效果上看
是可以在容器对象(例如链表或数组)上遍历访问的接口
设计人员无需关心容器对象的内存分配的实现细节
可以用foreach遍历的类,都是实现了迭代器的

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

继承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 语法糖实现迭代器

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 语法糖为泛型类实现迭代器

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];}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络技术】【Kali Linux】Wireshark嗅探(十二)NBNS协议报文捕获及分析

往期 Kali Linux 上的 Wireshark 嗅探实验见博客&#xff1a; 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;一&#xff09;ping 和 ICMP 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;二&#xff09;TCP 协议 【网络技术】【Kali Linux】Wireshark嗅探&…

linux添加hdmi、dp自定义分辨率

https://cn.linux-console.net/?p1452 未测试 $ xrandr Screen 0: minimum 16 x 16, current 2560 x 1440, maximum 32767 x 32767 XWAYLAND0 connected primary 2560x144000 (normal left inverted right x axis y axis) 600mm x 330mm2560x1440 59.96*1920x1440 59…

加入MongoDB AI创新者计划,携手MongoDB共同开创AI新纪元

加入MongoDB AI创新者计划&#xff01; MongoDB对AI创新和初创企业的支持既全面又广泛&#xff01;无论您是领先的AI初创企业还是刚刚起步&#xff0c;MongoDB Atlas都是支持您愿景的最佳平台。 AI 初创者计划The AI Startup Track AI初创者计划为早期初创企业提供专属福利&…

java单元测试:集成测试

单元测试和集成测试是软件测试中两个重要的阶段&#xff0c;它们在测试过程中扮演不同的角色&#xff0c;但目标都是确保软件的质量和稳定性。以下是对单元测试和集成测试的详细介绍。 1. 单元测试&#xff08;Unit Testing&#xff09; 1.1 定义 单元测试是对软件中的最小可…

hcia datacom学习(10):交换机基础

1.二层交换机工作原理 1.1交换机的5种行为 查看mac地址表的命令为 dis mac-address *一个MAC只能关联在一个接口上&#xff0c;一个接口上可以学习多个MAC *mac地址漂移&#xff1a;mac表中&#xff0c;mac地址的出接口从一个端口变为另一个端口的现象。 造成mac漂移的原因…

【C++提高编程-03】----C++之STL常用容器基础实战

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

移动云——让每个人都能享受云技术的魅力

一、引言 云技术的起源可以追溯到20世纪60年代和70年代&#xff0c;随着科技的发展&#xff0c;现在早就和所有人息息相关。在云技术的浪潮中&#xff0c;有这么一家厂商通过自己的努力&#xff0c;深耕云计算市场&#xff0c;不仅有各种各样的产品为开发者提供服务&#xff0…

git push后一直卡在在Writing objects:问题

git push后一直卡在Writing objects: 解决&#xff1a;设置 git config --global http.postBuffer 5242880000在执行git push。 一般设置后就可以成功了&#xff0c;后面不用看。 2. 我这里结果又报错&#xff1a; fatal: protocol error: bad line length 8192 MiB | 107.46 …

人工智能应用-实验8-用生成对抗网络生成数字图像

文章目录 &#x1f9e1;&#x1f9e1;实验内容&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;代码&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;分析结果&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;实验总结&#x1f9e1;&#x1f9e1; &#x1f9…

嵌入式实时操作系统笔记2:UCOS基础知识_UC/OS-III移植(STM32F4)_编写简单的UC/OS-III任务例程(失败.....)

今日学习嵌入式实时操作系统RTOS&#xff1a;UC/OS-III实时操作系统 本文只是个人学习笔记备忘用&#xff0c;附图、描述等 部分都是对网上资料的整合...... 文章主要研究如何将UC/OS-III 移植到 STM32 F407VET6上&#xff0c;提供测试工程下载 &#xff08;2024.5.21 文章未…

Java web应用性能分析之【高并发之缓存-多级缓存】

说到缓存&#xff0c;作为java开发第一时间想到的是不是上图所示的Redis&#xff0c;又或者是Guava Cache、Caffeine、EhCache这些&#xff1b;Redis作为分布式缓存、其他的可以作为本地缓存。但是作为一名资深开发人员&#xff0c;着眼的层面应该再提升一个级别&#xff0c;从…

Prometheus监控平台配置--监控mysql

上一篇中讲述了怎么安装Prometheus&#xff0c;然后对服务器集群资源信息进行监控并通过grafana展示监控信息&#xff0c;在这一篇中我们只讲和mysql相关的监控&#xff0c;关于prometheus的监控原理以及安装可以看下上一篇。 1.上传 通过rz命令将安装包上传到任意目录&#xf…

翻译AnyDoor: Zero-shot Object-level Image Customization

摘要 本研究介绍了AnyDoor&#xff0c;这是一款基于扩散模型的图像生成器&#xff0c;能够在用户指定的位置&#xff0c;以期望的形状将目标对象传送到新场景中。与为每个对象调整参数不同&#xff0c;我们的模型仅需训练一次&#xff0c;就能在推理阶段轻松地泛化到多样化的对…

SpringBoot——整合Redis

目录 Redis 创建Commodity表 启动MySQL和Redis 新建一个SpringBoot项目 pom.xml application.properties Commodity实体类 ComMapper接口 ComService业务层接口 ComServiceImpl业务接口的实现类 ComController控制器 RedisConfig配置类 SpringbootRdisApplication启…

在Visual Studio Code和Visual Studio 2022下配置Clang-Format,格式化成Google C++ Style

项目开发要求好的编写代码格式规范&#xff0c;常用的是根据Google C Style Guide 网上查了很多博文&#xff0c;都不太一样有的也跑不起来&#xff0c;通过尝试之后&#xff0c;自己可算折腾好了&#xff0c;整理一下过程 背景&#xff1a; 编译器主要有三部分&#xff1a;前…

Baidu地图SDK接入后的点击事件实现。

在很多APP中&#xff0c;我们接入了百度地图&#xff0c;而这个百度地图只是拥有提示、展示的作用&#xff0c;并不希望它具有操作功能。 比如&#xff0c;在外卖APP中&#xff0c;粗略地展示一下地理位置&#xff0c;点击地图后&#xff0c;直接跳转对应的导航。 于是这样写…

Github 2024-05-25 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-25统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目3TypeScript项目3非开发语言项目1HTML项目1Rust项目1Go项目1Jupyter Notebook项目1Java项目1Angular文档:交付Web应用程序的自信之选…

【Kotlin】使用`when`表达式来实现类似于Java中的`switch`语句的功能

val 常量 val x 2 when (x) {1 -> println("x is 1")2 -> println("x is 2")else -> println("x is neither 1 nor 2") }在这个示例中&#xff0c;when表达式会根据x的值执行相应的代码块。如果x的值是1&#xff0c;那么会执行第一个…

C++第三方库 【HTTP/HTTPS】— httplib库

目录 认识httplib库 安装httplib库 httplib的使用 httplib请求类 httplib响应类 Server类 Client类 httplib库搭建简单服务器&客户端 认识httplib库 httplib库&#xff0c;是一个C11单头文件的&#xff0c;轻量级的跨平台HTTP/HTTPS库&#xff0c;可以用来创建简单的…

全面透视AI Agents:概念、功能、类型、原理、优点、示例和趋势

AI Agents 技术正在引领商业领域的革命性变革。本文将为您提供一个全面的视角&#xff0c;深入探讨 AI Agents 的工作原理、功能特性以及其多样化的类型&#xff0c;包括反应式 Agents、目标驱动 Agents、效用驱动 Agents 和学习型 Agents。通过深入了解 AI Agents 的运作机制&…