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

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();}}
}

相关文章:

  • C# 使用HttpListener时候异常(此平台不支持此操作:System.PlatformNotSupportedException)
  • 基于大模型预测单纯性孔源性视网膜脱离的技术方案
  • 解析OpenFOAM polymesh网格文件的C/C++程序实现
  • Spring Boot的Security安全控制——认识SpringSecurity!
  • 信号(瞬时)频率求解与仿真实践(2)
  • 记录jackson解析出错
  • Python 训练营打卡 Day 50
  • 小知识点三、无刷电机闭环控制
  • 静态指令和动态指令的区别 GPT版
  • qt信号与槽--01
  • 如何设置爬虫的访问频率?
  • Hadoop 003 — JAVA操作MapReduce入门案例
  • React Native 项目实战 —— 记账本应用开发指南
  • 龙虎榜——20250613
  • 对象存储数据一致性:S3 vs Azure Blob vs GCS对比解析 (2025)
  • 前端持续集成和持续部署简介
  • 当雷达学会“读心术” 汽车舱内安全迈入新纪元
  • PyTorch框架详解(1)
  • html+css+js趣味小游戏~(附源码)
  • Java过滤器的基本概念
  • 青岛专业做网站优化/免费企业建站
  • 做网站的 深圳/新网站排名优化怎么做
  • 莱芜信息港网页/seo优化的技巧
  • wordpress 如何从新安装/云优客seo排名公司
  • 陕西专业网站开发联系电话/宁德市安全教育平台
  • 营销型网站设计公司哪里有/上海搜索优化推广哪家强