文档

C# Iterators

关键内容

  1. 普通接口
public interface IEnumerable
{IEnumerator GetEnumerator();
}public interface IEnumerator
{object Current { get; }bool MoveNext();void Reset();
}
  1. 泛型接口
public interface IEnumerable<out T> : IEnumerable
{IEnumerator<T> GetEnumerator();
}
public interface IEnumerator<out T> : IEnumerator, IDisposable
{T Current { get; }
}
  1. yield return
    使用yield return可简化迭代器的生成,不需要自己手动创建类进行实现。
    注意:使用yield return生成的迭代器,无法使用Reset。
    如需Reset,可自定义迭代器类,进行实现。

示例

TransformForeach1实现泛型接口IEnumerable,自己实现迭代器
TransformForeach2实现泛型接口IEnumerable,使用yield return实现迭代器
对比得知:yield return 可方便的简化迭代器生成
注意:如果实现泛型版本接口,yield return 返回类型要和泛型指定的类型一致

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test04 : MonoBehaviour
{TransformForeach1 foreachTransform1;IEnumerator<Transform> ator1;TransformForeach2 foreachTransform2;IEnumerator<Transform> ator2;void Start(){int childCount = 5;for (int i = 0; i < childCount; i++){var obj = new GameObject(i.ToString());obj.transform.SetParent(transform);}foreachTransform1 = new TransformForeach1(transform);ator1 = foreachTransform1.GetEnumerator();foreachTransform2 = new TransformForeach2(transform);ator2 = foreachTransform2.GetEnumerator();}private void Update(){if (Input.GetKeyDown(KeyCode.Space)){//使用类实现泛型迭代器接口 可使用Reset方法Debug.Log("1...");while (ator1.MoveNext()){Debug.Log(ator1.Current);}ator1.Reset();foreach (var item in foreachTransform1){Debug.Log(item);}Debug.Log("2...");//使用yield return实现泛型迭代器接口,无法使用Reset方法try{while (ator2.MoveNext()){Debug.Log(ator2.Current);}ator2.Reset();}catch (System.Exception e){Debug.LogException(e);}        foreach (var item in foreachTransform2){Debug.Log(item);}}}private class TransformForeach1 : IEnumerable<Transform>{Transform transform;public TransformForeach1(Transform transform){this.transform = transform;}public IEnumerator<Transform> GetEnumerator(){return new Enumerator(transform);}IEnumerator IEnumerable.GetEnumerator(){return GetEnumerator();}private class Enumerator : IEnumerator<Transform>{int index = -1;Transform transform;public Enumerator(Transform transform){this.transform = transform;}public Transform Current => transform.GetChild(index);object IEnumerator.Current => Current;public void Dispose(){}public bool MoveNext(){var childCount = transform.childCount;return ++index < childCount;}public void Reset(){index = -1;}}}private class TransformForeach2 : IEnumerable<Transform>{Transform transform;public TransformForeach2(Transform transform){this.transform = transform;}public IEnumerator<Transform> GetEnumerator(){var length = transform.childCount;for (int i = 0; i < length; i++)yield return transform.GetChild(i);}IEnumerator IEnumerable.GetEnumerator(){return GetEnumerator();}}
}

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

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

相关文章

Java多线程:为什么wait()必须用循环而非if?

在Java多线程编程中&#xff0c;调用wait()方法时应使用**循环结构&#xff08;while循环&#xff09;**而非if块&#xff0c;这是由线程同步的特性和潜在风险决定的。以下是具体原因和实现规范&#xff1a; 一、正确调用方式 synchronized (lockObject) {while (!condition) …

Fiori 初学记录----怎么调用后端系统odata 服务实现简单的CURD

1.对上面的内表做一个简单的增删改查的操作 SEGW 创建odata 项目&#xff0c;实现增删改查方法。如下图 2.odata 准备完毕后&#xff0c;打开vscode 下一步等待项目生成 把下面这个目录的视图&#xff1a;替换一下&#xff1a; View1.view.xml 代码&#xff1a; <…

OpenCV CUDA模块图像变形------对图像进行GPU加速的仿射变换函数warpAffine()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数用于对图像进行 GPU 加速的仿射变换&#xff08;Affine Transformation&#xff09;&#xff0c;是 cv::warpAffine 的 CUDA 版本。支持平…

语音增强方法

一、音量增强 音量增强&#xff0c;顾名思义就是音量的调大和调小&#xff0c;通过对音量进行增强可以使得模型更好的泛化。防止数据只有小音量时&#xff0c;当有大音量传入时模型不能很好的进行识别。 下面是我对音量增强生成频谱图进行可视化的结果 上面的一个图片是音量…

内网渗透测试技巧与利用操作手册(SMB / MSSQL / LDAP)

SMB 枚举与利用清单 &#x1f50d; SMB 枚举与连接 # 尝试空会话连接&#xff08;Null Session&#xff09; smbclient -N -U "" -L \\<IP> smbclient -N -U "test" -L \\<IP> smbclient -N -U "Guest" -L \\<IP># 下载共享…

ADB(Android Debug Bridge)Android官方调试工具及常用命令

ADB的定义 ADB&#xff08;Android Debug Bridge&#xff09;是Android官方提供的调试工具&#xff0c;属于Android SDK的一部分。它通过命令行与Android设备通信&#xff0c;支持安装应用、调试、文件传输、日志抓取等功能&#xff0c;适用于开发、测试及高级用户场景。 ADB工…

再现重大BUG,微软紧急撤回Win 11六月更新

BUG年年有&#xff0c;今年特别多&#xff01; Windows 11发布这近4年来&#xff0c;咱们算是一路见证了其「要么在修复BUG&#xff0c;要么在修复BUG路上」这么一件壮举。 最新的6月Windows 11 24H2更新&#xff08;版本号KB5060842&#xff09;&#xff0c;微软带来了多项改…

ROS2 工作空间中, CMakeLists.txt, setup.py和 package.xml的作用分别是?

提问 ROS2 工作空间中, CMakeLists.txt&#xff0c; setup.py和 package.xml的作用分别是&#xff1f; 回答 在一个 ROS 2 包&#xff08;package&#xff09;里&#xff0c;这三个文件各司其职&#xff1a; package.xml 作用&#xff1a;声明包的元信息和依赖关系&#xff…

Untiy打包安卓踩坑

Untiy 版本&#xff1a;unity6.1 运行环境&#xff1a;Win11 报错一&#xff1a; Assembly ‘Assets/ExternalDependencyManager/Editor/1.2.183/Google.IOSResolver.dll’ will not be loaded due to errors: 解决方法&#xff1a;通过在 Unity Hub 中下载 iOS 包来解决 报错…

2025最新版!Windows Python3 超详细安装图文教程(支持 Python3 全版本)

大家好&#xff0c;我是你们的编程搬砖工~ 今天给大家安排一篇超级详细、超接地气、纯小白友好的《Python 安装教程 for Windows》&#xff0c;从下载到安装&#xff0c;从环境变量到验证&#xff0c;手把手带你装好 Python&#xff0c;不管你是 Python3.7、3.9、3.10 还是 3.1…

【IEEE/EI/Scopus检索】2025年第五届机器学习与大数据管理国际会议 (MLBDM 2025)

2025年第五届机器学习与大数据管理国际会议 (MLBDM 2025) 2025 5th International Conference on Machine Learning and Big Data Management(MLBDM 2025)会议地点&#xff1a;南京&#xff0c;中国 时间&#xff1a;2025年12月26日- 28日 ● 会议简介 2025年第五届机器学习…

前端实现ios26最新液态玻璃效果!

先看效果图 实现步骤 先定义玻璃元素和液态滤镜 <!--玻璃容器--> <div class"glass-container"><!--使用液态滤镜--><div class"glass-filter"></div><!--边沿效果--><div class"glass-specular">…

麒麟系统集成开发环境Kylin-IDE初体验,菜鸟小白入门教程

一、安装Kylin-IDE 1、打开应用商店&#xff0c;转到“软件”->“开发”页面&#xff0c;找到“Kylin-IDE”&#xff0c;点下载。&#xff08;也可以在搜索栏搜索Kylin-IDE&#xff09; 2、等待Kylin-IDE下载并自动安装完成。 3、双击桌面的Kylin-IDE图标。 4、自动弹出“开…

Python爬虫实战:研究Bleach库相关技术

一、引言 1.1 研究背景与意义 随着互联网的快速发展,网络上的数据量呈爆炸式增长。网络爬虫作为一种自动获取网页内容的技术,能够高效地从互联网上收集所需信息,为数据分析、信息检索、舆情监测等应用提供基础。然而,爬取到的网页内容往往包含大量的 HTML 标签、JavaScri…

分布假设学习笔记

文章目录 分布假设学习笔记自然语言处理中的分布假设应用场景适用范围 Word2vec、BERT和GPTWord2vecBERTGPT 假设成立吗 分布假设学习笔记 自然语言处理中的分布假设 分布假设&#xff08;Distributional Hypothesis&#xff09;是指&#xff1a;词语在相似上下文中出现&…

提升开发思维的设计模式(上)

1. 设计模式简介 [设计模式]&#xff08;Design pattern&#xff09; 是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路。通过设计模式可以帮助我们增强代码的[可重用性]、可扩充性、 可维护性、灵活性好。我们使用设计模式最终的目的是实现代码…

LINUX613计划测put

FTP put ┌────────────────────────────────────────────────────────────────────┐│ • MobaXterm 20.0 • ││ (SSH client, X-serv…

NB-IoT-下行同步、广播信道和信号

这一篇主要讲解以下NPSS/NSSS/NPBCH信号的具体细节。还是依然先分析时频资源&#xff0c;再分析具体信号细节。 1、NPSS信道和信号 NPSS信号总是在每个无线帧的子帧5上。使用符号为3~13个OFDM符号&#xff0c;子载波使用0~10号&#xff08;11个子载波&#xff09;。如果部署为…

Java TCP网络编程核心指南

Java网络编程中TCP通信详解 TCP (Transmission Control Protocol) 是互联网中最核心的传输层协议&#xff0c;提供可靠的、面向连接的字节流传输服务。在Java网络编程中&#xff0c;TCP通信主要通过Socket和ServerSocket类实现。 一、TCP核心特性与Java实现 特性描述Java实现…

SVN迁移Git(保留历史提交记录)

第一步&#xff1a;安装git 下载地址&#xff1a;https://gitforwindows.org/ 第二步&#xff1a;先创建一个git创库&#xff0c;&#xff08;创建过程忽略&#xff09; 第三步&#xff1a;本地新建一个空的项目文件夹&#xff0c;用于存放要迁移的项目代码&#xff0c;我这创…