首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

IEnumerable AND IEnumerator

正文 IEnumerable和IEnumerator,如果不仔细看,是不是都以为它们是同样的一个单词。特别是我们习惯了每天看大量的中文,这种只是很小区别的单词更是容易犯错。...好的,回到今天的主题:IEnumerable和IEnumerator。目前我们知道它俩是不一样的东西了,至少从单词层面(ง •_•)ง。那么在 DotNET 中,它们扮演着怎么样的角色呢?...IEnumerator说:我提供了支持对非泛型集合进行简单迭代的功能。...其实看接口的样貌我们就大概能够理解其中的奥秘了,IEnumerable 提供了可以迭代的能力,而这种能力是通过内部的可迭代对象来实现了,这个对象就是IEnumerator。...IEnumerator IEnumerable.GetEnumerator() { return (IEnumerator)GetEnumerator(); }

36330

2021年了,`IEnumerator`、`IEnumerable`接口还傻傻分不清楚?

IEnumerator IEnumerator、IEnumerable接口有相似的名称,这两个接口通常也在一起使用,它们有不同的用途。...IEnumerator接口为类内部的集合提供了迭代方式, IEnumerator 要求你实现三个方法: MoveNext方法:该方法将集合索引加1,并返回一个bool值,指示是否已到达集合的末尾。...public IEnumerator GetEnumerator() { return (IEnumerator)this; } 该用哪一个接口?...因此IEnumerable接口的GetEnumerator方法会返回一个IEnumerator接口。要实现IEnumerable,你还必须实现IEnumerator。...最佳实践 在嵌套类中实现IEnumerator,这样你可以创建多个枚举器。 为IEnumerator的Current方法提供异常处理。 为什么要这么做?

2.5K20

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

1、IEnumerator和IEnumerable的作用 其实IEnumerator和IEnumerable的作用很简单,就是让除数组和集合之外的类型也能支持foreach循环,至于foreach循环,...原因是C#中自定义集合类型要实现foreach的功能,必须通过IEnumerator和IEnumerable两个接口来实现!...2、通过IEnumerator和IEnumerable两个接口实现自定义集合类型的foreach循环功能....实现了IEnumerable接口之后,发现该接口规定必须返回一个IEnumerator接口(迭代器对象).ok,那么就必须返回一个IEnumerator,那么它是什么呢?别急,下面开始介绍这个接口!...第二步:通过IEnumerable要求实现的GetEnumerator()方法返回一个IEnumerator(迭代器对象),实现该接口必须实现以下三个方法/属性: ?

904100

5-迭代器

System.Collections.IEnumerable接口[公开枚举数,该枚举数支持在非泛型集合上进行简单迭代, 也可以不实现该接口,该接口定义了一个方法GetEnumerator(),返回一个支持IEnumerator...接口的对象,IEnumerator的成员如下: 名称 说明 bool MoveNex t方法 将枚举数推进到集合的下一个元素 void Rese t方法 将枚举数设置为其初始位置,该位置位于集合中第一个元素之前...改写上述代码: //MyEnumerable方法全部删掉 public IEnumerator GetEnumerator() { for (int i = 0; i < items.Length...只需实现一个接口IEnumerable就可以了[或者说有public IEnumerator GetEnumerator()此方法就可]; 像是匿名方法一样,编译器帮我们做了很多[这里编译器帮我们生成了..."实现IEnumerator接口的一个类",通过查看IL代码得知]。

48250

.NET面试题系列 - IEnumerable

实现方法GetEnumerator GetEnumerator方法需要一个IEnumerator类型的返回值,这个类型是一个接口,所以我们不能这样写: return new IEnumerator();...我们可以查看IEnumerator元数据,其解释十分清楚: Enumerator代表一个类似箭头的东西,它指向这个集合当前迭代指向的成员 IEnumerator接口类型对非泛型集合实现迭代 Current...使用yield关键字实现方法GetEnumerator 如果iterator本身有实现IEnumerator接口(本例就是一个数组),则可以有更容易的方法: public IEnumerator...yield是一个语法糖,它的本质是为我们实现IEnumerator接口。...迭代显然是非线程安全的,每次IEnumerable都会生成新的IEnumerator,从而形成多个互相不影响的迭代过程。 在迭代时,只能前进不能后退。新的迭代不会记得之前迭代后值的任何变化。

63020

Coroutine,你究竟干了什么?

第二个疑问就是返回类型IEnumerator,名字奇怪也就罢了,我还需要使用yield return这种奇怪的方式来进行返回,而且貌似WaitForSeconds也并不是一个所谓IEnumerator的类型...Coroutine大概是这个样子的……   随着自己对C#有了进一步的了解,我才慢慢发现,上面所言的那两个奇怪的IEnumerator和yield return,其实并不是Unity的什么独创,相反,他们却是...而至于yield return,其实是C# 2.0新引进的一种实现迭代器模式的简便语法,在之前的C# 1.0中,如果要实现一个完整的迭代器,我们必须要分别实现IEnumerable和IEnumerator...譬如我们写下了如下的代码: IEnumerator Test() {     yield return 1;     yield return 2;     yield return 3; }...> m_enumerators = new List(); List m_enumeratorsBuffer

1K10

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

Coroutine实际上由IEnumerator接口以及一个或者多个的yield语句构成的迭代器(iterator)块构成。...枚举器接口 IEnumerator 包含3个方法: Current:返回集合当前位置的对象 MoveNext:把枚举器位置移到集合的下一个元素,它返回一个bool值,表示新的位置是否超过索引 Reset...当然我们也可以创建自己的可被枚举的类,需要为它提供自定义的枚举器,只需实现IEnumerator接口即可。...没错,返回的就是枚举器,你会疑问,你没有定义一个枚举器并且实现了IEnumerator接口啊!...别急,问题就出在yield上,C#为了简化我们创建枚举器的步骤,你想想看你需要先实现IEnumerator接口,并且实现Current,MoveNext,Reset步骤。

1.4K60

IEnumerable 使用foreach 详解

自己实现迭代器 .net中迭代器是通过IEnumerable和IEnumerator接口来实现的,今天我们也来依葫芦画瓢。 首先来看看这两个接口的定义: ? ? 并没有想象的那么复杂。...其中IEnumerable只有一个返回IEnumerator的GetEnumerator方法。而IEnumerator中有两个方法加一个属性。...我们还记得IEnumerator的定义吗 ? 接口的定义就只有get没有set。所以我们在foreach中不能修改item的值。 我们再来回答第二个问题:“要实现foreach需要满足什么条件?”...所以要可以foreach只需要对象定义了GetEnumerator无参方法,并且返回值是IEnumerator或其对应的泛型。细看下图: ? 也就是说,只要可以满足这三步调用即可。...yield的使用 你肯定发现了我们自己去实现IEnumerator接口还是有些许麻烦,并且上面的代码肯定是不够健壮。对的,.net给我们提供了更好的方式。 ?

1.7K40

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券