当前位置: 首页 > java >正文

C#迭代器

文档

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.xdnf.cn/news/14011.html

相关文章:

  • xa_get_mark 简介
  • PyCharm 配置python解释器
  • 跨网软件如何重塑能源行业?推荐高效协同的跨网传输方案
  • 在python中获取符合特定模式的文件
  • 《Java开发工具全解析:从基础到前沿》
  • MySQL数据库死锁全解析:发生场景、定位方法、解决方案及最佳实践
  • 京东率先开启“3D信息流时代” 让购物更有趣
  • TortoiseSVN 下载指定版本客户端及对应翻译(汉化)包
  • ABP vNext + OpenIddict:自定义 OAuth2/OpenID Connect 认证策略
  • 搭建前端项目 Vue+element UI引入 步骤 (超详细)
  • 2025年第二届仿真与电子技术国际学术会议(ICSET 2025)
  • 用 PlatformIO + ESP-IDF 框架开发 ESP32
  • OB Cloud × 海牙湾:打造高效灵活的金融科技 AI 数字化解决方案
  • 安科瑞中小工商业储能监测-能量管理系统Acrel-2000ES
  • SAP 生产订单报工检查报错异常(接口)
  • 智能客服不再冰冷,声网AI为品牌构建情绪接口
  • 仪表刻度动态显示控件--小三角指针
  • 语言模型进化论:从“健忘侦探”到“超级大脑”的破案之旅
  • MQTT协议
  • 使用Word2Vec实现中文文本分类
  • [深度学习]卷积神经网络
  • 【王阳明代数集合论基础】情感分析之句子的基本结构
  • MiniMind(1)Tokenizer与训练数据
  • 从Pura 80系列影像和鸿蒙AI融合看华为创新的“不可复制性”
  • [Rviz2报错,已解决!]导入urdf模型错误:Could not load mesh resource 。。。
  • 【Vue PDF】Vue PDF 组件初始不加载 pdfUrl 问题分析与修复
  • 【图像恢复算法】 ESRGAN Real-ESRGAN的配置和应用
  • SSE详解
  • 前端跨域解决方案(1):什么是跨域?
  • 【Bluedroid】蓝牙启动之 GAP_Init 流程源码解析