首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在C#中等待IEnumerator函数的完全执行?

在C#中,可以使用yield return关键字来创建一个返回IEnumerator的函数。IEnumerator接口提供了一种迭代集合的方式,它包含了MoveNext()方法和Current属性。

要等待IEnumerator函数的完全执行,可以使用foreach循环来迭代整个集合。foreach循环会自动处理MoveNext()方法的调用和Current属性的获取,直到迭代完成。

以下是一个示例代码:

代码语言:txt
复制
using System;
using System.Collections;

public class Program
{
    public static void Main()
    {
        IEnumerator enumerator = MyFunction().GetEnumerator();
        
        while (enumerator.MoveNext())
        {
            // 处理每个元素
            Console.WriteLine(enumerator.Current);
        }
        
        Console.WriteLine("函数执行完毕");
    }
    
    public static IEnumerable MyFunction()
    {
        yield return "第一个元素";
        yield return "第二个元素";
        yield return "第三个元素";
    }
}

在上面的示例中,MyFunction()是一个返回IEnumerable的函数,通过使用yield return关键字,它可以逐个返回元素。在Main()方法中,我们通过调用GetEnumerator()方法获取一个IEnumerator对象,并使用MoveNext()方法和Current属性来迭代集合中的元素。

MoveNext()方法返回false时,表示迭代完成,函数执行完毕。

这是一个简单的例子,你可以根据实际需求来编写更复杂的IEnumerator函数,并在其中使用yield return来返回元素。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

用ECMAScript4 ( ActionScript3) 实现Unity热更新 -- CustomYieldInstruction 自定义中断指令

这次来建立一个示例,演示一下如何在脚本自定义协程中断指令 Unity协程 unity协程经常被用到,从本质上来讲,当调用startCoroutine时,传入参数是一个实现IEnumerator...如此,协程可以自然将某一串操作分摊到多帧执行,给人一种类似多线程效果,但是这不是多线程。 yield关键字 yield是C# 2.0开始提供一个语法糖。...使用yield可以非常方便创建IEnumerator接口对象。 Unity协程等待条件 如前所述,IEnumerator 接口每次访问,可以获取当前集合对象。...在热更新脚本实现 按照Unity示例,它展示了当点击鼠标左键时,启动一个协程,然后此协程一直等待,直到鼠标右键被点击后继续执行。 我们可以直接在热更新移植实现如上逻辑。 创建一个新热更项目。...如此,我们就了解了如何在热更新操作协程

1.4K90

Unity巧用协程和游戏对象生命周期处理游戏重启问题

(string methodName) 2)执行执行函数其返回值必须为IEnumerator(迭代器) 3)停止,常用方法:StopCoroutine(string methodName) | StopCoroutine...()函数启动协程 ?...因为C#脚本通常都会挂载到一个场景(Scene)或者一个游戏对象(GameObject)上,而重启就势必会销毁场景,这样脚本里函数在Destroy就不会再被执行了。...,然后在Start函数执行:销毁 –> 间隔一段时间(用上面的yield return null或者Unity提供延时处理指令) –> 初始化 –> 销毁 new出来GameObject对象。...,然后停一帧 yield return null; // 这里可以调用销毁相关函数:关闭Lua虚拟机、相关资源释放等,然后再停一帧 yield

3K20

学习|Unity3D使用协程实现减速停车效果

微卡智享 协程本身有点像线程,但又不同于线程,协程本身还是在主程序运行完全不用考虑使用线程时线程锁或是线程同步问题。...官方文档Monobehaviour函数执行顺序图,就对协程再次执行时机做了很好描述: ?...();//在所有的渲染以及GUI程序执行完成后从当前位置继续执行yield new WaitForFixedUpdate();//所有脚本FixedUpdate()函数都被执行后从当前位置继续执行yield...;//如果使用yield break语句,将会导致协程执行条件不被满足,不会从当前位置继续执行程序,而是直接从当前位置跳出函数体,回到函数根部 程序实现 ?...扫描二维码 获取更多精彩 微卡智享 「 往期文章 」 学习|Unity3d导航实现循环线路移动 学习|C#线程AutoResetEvent使用 学习|C#EventHandler委托使用

1.2K20

Unity 协程

但是就他效率而言个人感觉并不乐观,个人理解有点像LUA闭包,C#goto语句,需要保存大量数据和大量逻辑处理,而针对于实际业务来讲我们可能需要逻辑量并没有那么大,另外协程如果有比较复杂逻辑处理...由上可以看出,1.对于使用方法名调用带参数函数,运行时会报错。 2 .同一个协程函数可以被多次调用。 细心同学可能会有问,如果上例函数别重载,使用方法名方式调用会不会有问题呢?...由上图可以发现,等待时间结束后执行时机在update后,lateupdate前。...predicate执行时机为首次执行为调用时机(比如在Start开启协程,则本帧在Start时执行,本帧Update后则不再执行),之后执行时机为Update之后,LateUpdate之前。...例如实现等待指定帧数后执行自定义函数 Tips 返回任意类型 如果yiled return 返回类型是我们随意定义一个类型,比如yiled return vecter3.one,则下一帧继续执行后续内容

67020

Coroutine,你究竟干了什么?

C#到处可见迭代器构造方式(之一),你也许对于迭代器这个东西没什么印象,但实际上,我们可能天天都在使用它!...而至于yield return,其实是C# 2.0新引进一种实现迭代器模式简便语法,在之前C# 1.0,如果要实现一个完整迭代器,我们必须要分别实现IEnumerable和IEnumerator...OK,让我们继续回到Unity,通过上面的这些分析,我们大概就肯定了这么一点:Unity其实是使用了迭代器来实现延时,像IEnumerator、yield return等使用皆是为了配合C#迭代器语法...IEnumerator()之一,而C#构造函数是没有返回值,显然不符合这个原则,所以实际上在构造函数我们无法使用什么yield return,另外一点,虽然上述帖子方法可以实现自己延时操作...MoveNext()操作,但如果他发现IEnumerator其实是一个WaitForSeconds类型的话,那么他就会进行特殊等待,一直等到WaitForSeconds延时结束了,才进行正常MoveNext

1K10

C#枚举器(译)

这在C# 2.0C# 1.1更容易实现一些。作为演示,我们先在 C# 1.1为一个简单集合添加枚举,然后我们修改这个范例,使用新C#2.0 枚举构建方法。...我们将以创建一个简单化List Box作为开始,它将包含一个8字符串数组和一个整型,这个整型用于记录数组已经添加了多少字符串。构造函数将对数组进行初始化并使用传递进来参数填充它。...你可以通过ListBoxEnumerator构造函数来传递。...C# 2.0 解救办法 使用C# 2.0 这些问题如同五月末雪般融化了。在这个例子2.0版本,我重写上面的列表,使用C# 2.0两个新特性:泛型 和 枚举器。...这样,下面的语句是完全正确C#语句: public IEnumerator GetEnumerator() { yield return "Who"; yield return " is"

1.8K40

C#2.0新增功能05 迭代器

下次调用迭代器函数时,将从该位置重新开始执行。 通过 foreach 语句或 LINQ 查询从客户端代码中使用迭代器。   ...在以下示例,foreach 循环首次迭代导致 SomeNumbers 迭代器方法继续执行,直至到达第一个 yield return 语句。 此迭代返回值为 3,并保留当前在迭代器方法位置。...在循环下次迭代,迭代器方法执行将从其暂停位置继续,直至到达 yield return 语句后才会停止。 此迭代返回值为 5,并再次保留当前在迭代器方法位置。...在 Main ,foreach 语句体每次迭代都会创建一个对迭代器函数调用,并将继续到下一个 yield return 语句。...在 C# ,迭代器方法不能有任何 in、ref 或 out 参数。 在 C# ,“yield”不是保留字,只有在 return 或 break 关键字之前使用时才有特殊含义。

70050

Unity应用架构设计(10)——绕不开协程和多线程(Part 1)

别急,问题就出在yield上,C#为了简化我们创建枚举器步骤,你想想看你需要先实现IEnumerator接口,并且实现Current,MoveNext,Reset步骤。...C#从2.0开始提供了有yield组成迭代器块。编译器会自动更具迭代器块创建了枚举器。...,想必你对Untiy协程有一定了解了。...中断:传统方法代码块执行流程是从上到下依次执行,而yield构成迭代块是告诉编译器如何创建枚举器行为,反编译得到结果可以看到,它们执行并不是连续,而是通过switch来从一个状态(state...)跳转到另一个状态 产出:yield 是和return连用, yield return之后语句被编译器赋值给current变量,最终通过Current属性产出枚举项 小结 本文初衷是想介绍如何在Unity

1.4K60

你认识C# foreach语法糖,真的是全部吗?

----闭包是在词法环境捕获自由变量头等函数, 题中关键是捕获自由变量。这里面有3个关键名词,希望大家重视,可以围观我之前 新来总监,把C#闭包讲得那叫一个透彻[1]。...demo1for循环内闭包,局部变量i是被头等函数引用自由变量;相对于每个头等函数,i是全局变量;闭包捕获变量i时空和 闭包执行时空不是一个时空;所有闭包执行时,捕获都是变量i,所以执行输出都是...两者内核 都是C# for循环。循环变量相对全局, 每个闭包引用都是(相对全局)自由变量v,最终闭包执行是同一个变量。...画外音本文其实内容很多:闭包:是在词法环境捕获自由变量头等函数foreach 语法糖:依赖于IEnumerable和IEnumerator 接口实现,同时 foreach每次迭代使用是块内局部变量...参考资料[1]新来总监,把C#闭包讲得那叫一个透彻: https://www.cnblogs.com/JulianHuang/p/14618378.html[2]IEnumerator、IEnumerable

62440

C#8.0宝藏好物Async streams

await本质 .NET诞生之初,就通过IEnumerable、IEnumerator提供迭代能力, 前者代表具备可枚举性质,后者代表可被枚举方式。...如果你真的使用强类型IEnumerable/IEnumerator来产生/消费可枚举类型,会发现要写很多琐碎代码。 C#推出yield return迭代器语法糖,简化了产生可枚举类型编写过程。...(编译器将yield return转换为状态机代码来实现IEnumerable,IEnumerator) yield 关键字可以执行状态迭代,并逐个返回枚举元素,在返回数据时,无需创建临时集合来存储数据...C#提供了迭代、异步快捷方式,能否将两者结合? 两者结合效果就是:我们希望在数据就绪时,接收并处理数据,但不会以阻塞cpu形式等待,这在lot流式数据很常见。...C#8.0 Asynchronous streams C#8.0一个重要特性是异步流(async stream), 可以轻松创建和消费异步枚举。

94430

迭代器模式

IEnumerator对象就像是序列“游标”或“书签”。一个集合可以有多个“书签”,移动其中任何一个都可以枚举集合,与其他枚举器互不影响。...迭代器方法运行到yield return语句时,会返回一个expression,并保留当前在代码位置。下次调用迭代器函数时,将从该位置重新开始执行。...,C#编辑器编译成IL代码会包含IEnumerator实现。....NET Framework迭代器模式应用 C#foreach语句其实就是迭代器模式。任何可以使用foreach进行遍历对象,它一定是实现了IEnumerable接口。...迭代器模式使用感受 迭代器模式是与集合类紧密绑定在一起,一般来说,我们只要实现一个集合类,就应该同时提供这个集合迭代器,就像C#Collection,List、Set、Map等,这些集合都有自己迭代器

63230

【学习笔记】Unity3D官方游戏教程:Tanks Tutorial

OnEnable 和 OnDisable 函数使用 一般使用 GameObject 之前我是在 Awake() 或者 Start() 函数做一些初始化,最后配合 Destroy() 函数进行销毁,这次学习了...() 函数,而启用游戏物体时候相应调用 OnEnable() 函数,你在函数里写初始化代码就可以了。...音频混合效果输出 Audio Mixer 想象一下这种场景:一个游戏中充杂着各种各样音频音效,比如同时有背景音乐、坦克行走声音、坦克引擎声响、炮弹炮炸声等等,这个时候是不是完全不能分辨哪个音效在发挥作用了...3 秒钟,接着进入下一场,如此循环…… 这是一个循环模式,如果采用普通代码写出来在逻辑上会比较麻烦,使用 C# yet return 配合 IEnumerator 能够完美实现相关逻辑和代码,伪代码如下...我可以说非常有用,比如:坦克大战,这个摄像机需要同时把所有坦克玩家置于视野当中,那么就需要根据当前坦克位置来移动并放大或者缩小相机视野范围。那么如何在此摄像机父物体局部坐标系下进行处理呢?

1.2K50

C# 通过IEnumberable接口和IEnumerator接口实现自定义集合类型foreach功能

1、IEnumerator和IEnumerable作用 其实IEnumerator和IEnumerable作用很简单,就是让除数组和集合之外类型也能支持foreach循环,至于foreach循环,...原因是C#自定义集合类型要实现foreach功能,必须通过IEnumerator和IEnumerable两个接口来实现!...(2)、Current属性   ---返回正在遍历集合元素 (3)、Reset()   ---重置当前正在遍历集合中元素索引....通过自定义集合类构造函数,或者方法,或者属性(都可以),初始化一个类数组   !...Important 3、将初始化完类数组作为参数传递给迭代器类 4、编写迭代器类,create 构造函数,接收自定义集合类初始化完类数组 5、实现IEnumerator(迭代器)接口,实现对应三个方法

905100

【5min+】你怎么穿着品衣服?IEnumerable AND IEnumerator

它所包含了.net体系可能会涉及到方方面面,比如C#小细节,AspnetCore,微服务.net知识等等。 场景 您可以在下班坐地铁时候,拿出手机逛一逛博客园,利用短短五分钟完成阅读。...好,回到今天主题:IEnumerable和IEnumerator。目前我们知道它俩是不一样东西了,至少从单词层面(ง •_•)ง。那么在 DotNET ,它们扮演着怎么样角色呢?...如果您了解过foreach原理,您就知道,它其实是C#为我们对一下代码包装: IEnumerator enumeratorLst = IEnumerableClass.GetEnumerator...(); while (enumeratorLst.MoveNext()) { Console.WriteLine(enumeratorLst.Current); } 所以,一层一层抽丝剥茧,原来脱掉了品衣服之后...总结 本来这次想给大家分享.net coreValueTask和Task,但是由于时间有点匆忙,素材没有收集完整,所以就只好等下次啦。 还是那句话,希望本篇文章没有花费您太多时间。

36430

精:C#历来版本特性一览

日常中大量特性早已信手拈来,当然从未尝试过特性更是难以尽数,但是每每回忆代码特性究竟是哪个版本引入,却颇为含糊。...尽管参考了微软官方文档,但所列特性难免基于我所接触使用到狭隘范围,用括号附上短评(【我是短评】),用以提示,希望不至于画蛇添足吧。...C# 1.2 发布日期:2003 年 4 月 从此版本开始,当 IEnumerator 实现 IDisposable 时,foreach 循环中生成代码会在 IEnumerator 上调用 Dispose...命名实参和可选实参【可以少些一些方法重载了】 泛型协变和逆变【完全体,但一般只有底层类库设计者需要考虑这玩意】 嵌入互操作类型【没什么存在感】 System.Threading.Tasks 命名空间【...【继续增强……】 函数指针【图穷匕见,高性能计算这一块与我似乎没有交集】 后面懒得列了…… C# 10 发布日期:2021 年 11 月 C# 10 继续致力于删除不必要模式、将数据与算法分离以及提高

14820

C#集合类型大揭秘

foreach是怎么实现? for依赖对 Length 属性和索引运算符 ([]) 支持。借助 Length 属性,C# 编译器可以使用 for 语句迭代数组每个元素。...return values[i]; } } IEnumerable和IEnumerator虽然实现简单,只有简单几个成员,但是却支撑起了C#语言中集合这座高楼大厦。...SortedDictionary 少;但是SortedDictionary可对未排序数据执行更快插入和移除操作:它时间复杂度为 O(log n...其内部实现也和Dictionary基本一致,也是散列函数加双数组实现,区别是存储Slot结构体不再有key。...**SortedSet支持元素按顺序排列,内部实现也是红黑树,并且SortedSet对于红黑树操作方法和SortedDictionary**完全相同。

1.1K70

C#集合类型大揭秘

foreach是怎么实现? for依赖对 Length 属性和索引运算符 ([]) 支持。借助 Length 属性,C# 编译器可以使用 for 语句迭代数组每个元素。...return values[i]; } } IEnumerable和IEnumerator虽然实现简单,只有简单几个成员,但是却支撑起了C#语言中集合这座高楼大厦。...SortedList和SortedDictionary同时支持快速查询和排序,SortedList 优势在于使用内存比 SortedDictionary 少;但是SortedDictionary可对未排序数据执行更快插入和移除操作...其内部实现也和Dictionary基本一致,也是散列函数加双数组实现,区别是存储Slot结构体不再有key。 内部实现数据结构: ?...SortedSet支持元素按顺序排列,内部实现也是红黑树,并且SortedSet对于红黑树操作方法和SortedDictionary完全相同。所以不再做过多分析。

1.5K40
领券