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

返回IEnumerable <T>和IEnumerator <T>的迭代器方法之间有什么区别吗?

在C#编程中,返回IEnumerable <T>和IEnumerator <T>的迭代器方法之间有一些区别。

IEnumerable <T>是一个接口,它提供了一种方法来遍历集合中的元素。它包含一个方法GetEnumerator(),该方法返回一个IEnumerator <T>对象。IEnumerable <T>接口通常用于实现foreach循环。

IEnumerator <T>是一个接口,它提供了一种方法来迭代集合中的元素。它包含三个方法:MoveNext()、Current和Dispose()。MoveNext()方法用于将枚举数推进到下一个元素。Current属性返回枚举数中的当前元素。Dispose()方法用于释放枚举数所使用的资源。

区别:

  1. 使用场景:IEnumerable <T>通常用于实现集合类型的遍历,而IEnumerator <T>用于迭代集合中的元素。
  2. 方法:IEnumerable <T>接口包含一个方法GetEnumerator(),而IEnumerator <T>接口包含三个方法:MoveNext()、Current和Dispose()。
  3. 迭代过程:使用IEnumerable <T>时,每次调用GetEnumerator()方法都会返回一个新的枚举数,而使用IEnumerator <T>时,可以在同一个枚举数上多次调用MoveNext()方法来迭代集合中的元素。

推荐的腾讯云相关产品:

腾讯云提供了一系列的云计算产品,可以帮助用户快速构建、部署和管理应用程序。这些产品包括云服务器、数据库、存储、容器、负载均衡、安全、CDN等。具体可以参考腾讯云官方文档。

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

相关·内容

C# 常用接口学习 IEnumerable

我们先去看看公开.Net4.0源程序中IEnumerableIEnumerableIEnumeratorIEnumerator这四个接口是如何声明: 需加微信交流群,请加小编微信号...GetEnumerator() { throw new NotImplementedException(); } } 加了一个返回迭代方法...迭代工作原理是:先调用MoveNext()方法,然后读取Current得到元素,直到MoveNext返回false。 我们需要3个字段分别放置 元素位置、元素、元素集。...其次,我们要把object Current改成 IEnumerator.Current,这个是实现迭代关键。返回元素。...(好像装箱行为) 第三,在MoveNext方法内累加索引,并从元素集中读取元素。然后让索引值超出元素集返回个false值。 最后,在Reset方法内让索引值为-1,不过好像直接抛出错误也成。

74930

IEnumerable 使用foreach 详解

自己实现迭代 yield使用 怎样高性能随机取IEnumerable值 我们先思考几个问题: 为什么在foreach中不能修改item值? 要实现foreach需要满足什么条件?...自己实现迭代 .net中迭代是通过IEnumerableIEnumerator接口来实现,今天我们也来依葫芦画瓢。 首先来看看这两个接口定义: ? ? 并没有想象那么复杂。...其中IEnumerable只有一个返回IEnumeratorGetEnumerator方法。而IEnumerator中有两个方法加一个属性。...我们还记得IEnumerator定义 ? 接口定义就只有get没有set。所以我们在foreach中不能修改item值。 我们再来回答第二个问题:“要实现foreach需要满足什么条件?”...所以要可以foreach只需要对象定义了GetEnumerator无参方法,并且返回值是IEnumerator或其对应泛型。细看下图: ? 也就是说,只要可以满足这三步调用即可。

1.7K40

C#2.0新增功能05 迭代

迭代可用于逐步迭代集合,例如列表和数组。   迭代方法或 get 访问可对集合执行自定义迭代迭代方法使用 yield return 语句返回元素,每次返回一个。...在以下示例中,foreach 循环首次迭代导致 SomeNumbers 迭代方法继续执行,直至到达第一个 yield return 语句。 此迭代返回值为 3,并保留当前在迭代方法位置。...在循环下次迭代中,迭代方法执行将从其暂停位置继续,直至到达 yield return 语句后才会停止。 此迭代返回值为 5,并再次保留当前在迭代方法位置。...不能在事件、实例构造函数、静态构造函数或静态终结中使用迭代。 必须存在从 yield return 语句中表达式类型到迭代返回 IEnumerable 类型参数隐式转换。...编译检测到迭代时,会自动生成 IEnumeratorIEnumerator 接口 Current、MoveNext Dispose 方法

70050

迭代模式

迭代模式在客户访问类与集合类之间插入一个迭代,这分离了聚合对象与其遍历行为,对客户也隐藏了其内部细节,且满足“单一职责原则”“开闭原则”。...迭代模式结构 迭代模式把存储数据遍历数据职责分离,所以它需要2个类:集合类迭代类。...此接口至关重要,因为至少必须实现IEnumerable方法,才支持迭代集合。IEnumerableIEnumerator接口类图: ?...这样实现好处在集合类不直接支持IEnumerator接口,而是直接支持另一种接口IEnumerable,其唯一方法是GetEnumerator。此方法用于返回支持 IEnumerator对象。...迭代执行过程 以下代码从迭代方法返回IEnumerable,然后遍历其元素。

63230

phpC#yield迭代实现方法对比分析

本文实例讲述了phpC#yield迭代实现方法对比。分享给大家供大家参考,具体如下: yield关键字是用来方便实现迭代,免去了手工写迭代繁琐。...迭代常被用来实现协程,所以大部分协程中都有yield关键字,可以参看unity3D协程。...C#版本: 函数返回类型必须为 IEnumerableIEnumerable<TIEnumeratorIEnumerator<T 。...IEnumerable表示一个类可以迭代,也就是可以用foreach遍历,IEnumerator是真正迭代实现,IEnumerableIEnumerator一个是使用迭代接口,一个是实现迭代接口...using System.Collections; class Program { //返回IEnumerable接口,其实返回了编译生成内部类 public static IEnumerable

61720

从yield关键字看IEnumerableCollection区别

表示Vector列表,而方法通过yield关键字返回三个Vectior对象。...在Main方法中,将GetVetors方法返回值赋值给一个变量,然后对每一个Vector对象XY进行重新赋值,最后将每一个Vector信息输出来。...为了避免不必要计算导致性能损失,LINQ查询一样,yield关键字并不会导致后值语句立即执行,而是转换成一个“表达式”。只有等到需要那一刻(进行迭代时候,表达式被才被执行。...由于两次迭代造作并不是同一批对象,才会导致XY属性依然“保持”着原始值。...同样是对于我们例子,我们在对GetVectors方法返回值进行变量赋值时候调用ToArray或者ToList方法,我们就能对元素进行有效赋值。

76480

5-迭代

集合要支持foreach则需要实现System.Collections.IEnumerable接口[公开枚举数,该枚举数支持在非泛型集合上进行简单迭代, 也可以不实现该接口,该接口定义了一个方法GetEnumerator...(),返回一个支持IEnumerator接口对象,IEnumerator成员如下: 名称 说明 bool MoveNex t方法 将枚举数推进到集合下一个元素 void Rese t方法 将枚举数设置为其初始位置...C#2.0以前,要使自己集合支持foreach遍历,需要写上面一大堆代码[实现两个接口,也可不实现, 但是必须给提供这两个接口中同名方法],C#2.0引入了yield return[返回每个元素]...yield break[终止迭代]两个组合而成上下文关键字。...只需实现一个接口IEnumerable就可以了[或者说public IEnumerator GetEnumerator()此方法就可]; 像是匿名方法一样,编译帮我们做了很多[这里编译帮我们生成了

48350

C#8.0宝藏好物Async streams

await本质 .NET诞生之初,就通过IEnumerableIEnumerator提供迭代能力, 前者代表具备可枚举性质,后者代表可被枚举方式。...如果你真的使用强类型IEnumerable/IEnumerator来产生/消费可枚举类型,会发现要写很多琐碎代码。 C#推出yield return迭代语法糖,简化了产生可枚举类型编写过程。...(编译将yield return转换为状态机代码来实现IEnumerableIEnumerator) yield 关键字可以执行状态迭代,并逐个返回枚举元素,在返回数据时,无需创建临时集合来存储数据...(编译将foreach抓换为强类型方法/属性调用) IEnumerable src = ...; IEnumerator e = src.GetEnumerator(); try { while...返回异步流方法特征: 以async修饰符声明 返回IAsyncEnumerable对象 方法包含yield return语句,用来异步持续返回元素 static async Task Main(

94430

yield在WCF中错误使用——99%开发人员都有可能犯错误

在Main方法中,我们先调用GetItems方法将“集合对象”返回,然后调用其ToArray方法。在调用该方法之前我们打印一段文字表明对集合对象进行迭代。...也就是说,一旦我们在一个返回类型为IEnumerable或者IEnumerable方式中通过yield return返回集合元素,意味着这个定义在方法中操作会被“延后执行”——操作真正执行不是发生在方法调用时候...,而是延后到对返回集合进行迭代时候。...IEnumerator,其 GetEnumerator()方法返回实际上就是他自己。...,但是目前来说为了避免这样问题,我推荐将WCF契约接口操作方法返回类型定义成数组,而不是IEnumerable或者IEnumerable(顺便说一下,WCF针对Array、List以及其他集合类型序列化

1.6K90

C#学习笔记四: C#2.0泛型 可控类型 匿名方法迭代

另外C#2.0还提出了可空类型,匿名方法迭代3个优美的特性。 1,泛型 1.1 泛型是什么 泛型英文表述是"generic", 这个单词意为通用。...前面讲到委托时候讲到 委托是后续诸多特性基础, 匿名方法委托有着莫大关系. 下面用代码来说明二者之间关系....然而在C#2.0中, 微软提供了yield关键字来简化迭代实现, 这使得自定义迭代变得容易了很多. 4.1,首先我们来看看IEnumerableIEnumerator区别来帮助我们理解迭代...: 先来看一下IEnumerable接口,其实看过这个接口之后,发现它其实是非常简单,只包含一个方法GetEnumerator(),它返回一个可用于循环访问集合IEnumerator对象,如下面代码所示...GetEnumerator(); 11 } 那么再来看看IEnumerator实现方法: 这里IEnumerator对象,其实就是另外一个接口,这个接口对象什么呢?

1.2K110

.NET面试题系列 - IEnumerable派生类

它赋予集合迭代能力。迭代是指从集合头部,一个一个将元素拿出来,直到全部拿完为止操作。迭代不能倒车,只能前进。IEnumerable迭代模式实现。...方法GetEnumerator返回一个IEnumerator类型输出。...IEnumerator类型又是一个接口,所以我们还要写一个类,并将这个类继承IEnumerator接口(实现它2个方法),建立这个类一个新实例,并传入一个数组(作为迭代源)作为方法GetEnumerator...该类型初始值为-1。IEnumerator类型Reset方法将这个值设为-1。通常不实现Reset方法,这是为了防止多次迭代。...IEnumerator接口MoveNext方法将位置增加一,并返回是否还有下一个元素。 可以通过yield简化方法GetEnumerator实现。

1.7K20

探索 yield 关键字

它使得开发人员可以通过定义自己迭代来简化代码,而不必手动实现 IEnumerable IEnumerator 接口。...使用 yield 关键字,可以将迭代值一次一个地返回,而不必使用一个集合对象存储所有的值。...当执行到yield return语句时,代码将会暂停执行,将返回值传递给迭代调用者,并将迭代状态保存下来。...由于我们使用了 yield 关键字,即使我们没有显式地实现IEnumerableIEnumerator接口,也能够遍历集合对象。...总结 使用 yield 关键字可以将一个方法转换为一个返回可枚举对象或迭代方法,而不必手动实现 IEnumerable IEnumerator 接口 使用 yield 来创建异步生成器,在某些场景下可以实现更高效

14620

IEnumerableIEnumerator关系

经常被问到对IEnumerableIEnumerator认识。。。 也一直知道是为了实现迭代、foreach... 那么到底是干什么呢?...到目前为止,理解到:我定义一个类型(类),实例化了一系列对象,一般情况下,我们会放到一个List里,那么这个集合,是支持foreach操作。...如果,我是说如果,我们不放在现有的集合里,而是放在一个数组里T[],那么如果我还想迭代之,如何做呢? 答案就是这两个东西:支持在非泛型集合上执行简单迭代。...IEnumerable里就一个方法返回IEnumerator类型对象; public IEnumerator GetEnumerator() IEnumerator三个方法需要实现。...至于在应用中具体应用,还没想到场景,希望您不吝赐教。

888100

Coroutine,你究竟干了什么?

()) {       // do something   }   上述代码首先通过arrayGetEnumerator方法来获取array一个“迭代”,然后通过“迭代MoveNext方法进行依次遍历...,而这“迭代”实际上就是之前那个稍显奇怪IEnumerator类型!...而至于yield return,其实是C# 2.0新引进一种实现迭代模式简便语法,在之前C# 1.0中,如果要实现一个完整迭代,我们必须要分别实现IEnumerableIEnumerator...但原理上基本可以看做是一个有限状态机,兴趣朋友可以看看更深入一些介绍,譬如这里这里。   ...IEnumerable()或者IEnumerator()之一,而C#中构造函数是没有返回,显然不符合这个原则,所以实际上在构造函数中我们无法使用什么yield return,另外一点

1K10

C#语言各种集合介绍

接口,所以任何集合类对象都有一个GetEnumerator()方法,该方法可以返回一个实现了 IEnumerator接口对象,这个返回IEnumerator对象既不是集合类对象,也不是集合元素类对象...中表示集合行为接口: 1)ICollection 定义所有集合大小、枚举数同步方法。...,该枚举数支持在集合上进行简单迭代 它只有一个方法 GetEnumerator(),该方法可以返回一个IEnumerator接口,通过它可以遍历集合 基本上所有的集合类都实现了这个接口 3)IList...IList实现是可排序且可按照索引访问其成员集合,它本身实现了ICollectionIEnumerable接口 是所有列表抽象基类。...)Queue 实现了接口:ICollection、IEnumerable Queque是队列,先进先出访问各个元素 可以调用Queque对象GetEnumerator()方法,得到IEnumerator

59221

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

IEnumerator IEnumeratorIEnumerable接口相似的名称,这两个接口通常也在一起使用,它们不同用途。...IEnumerator接口为类内部集合提供了迭代方式, IEnumerator 要求你实现三个方法: MoveNext方法:该方法将集合索引加1,并返回一个bool值,指示是否已到达集合末尾。...Current方法: 返回position位置的当前对象 IEnumerable IEnumerable接口为foreach迭代提供了支持,IEnumerable要求你实现GetEnumerator方法...因此IEnumerable接口GetEnumerator方法返回一个IEnumerator接口。要实现IEnumerable,你还必须实现IEnumerator。...,可以明显看到 foreach语法糖初次接触可枚举cars, 实际会访问cars实现 GetEnumerator()方法,拿到迭代 foreach每次迭代,实际会访问迭代Current属性

2.5K20

.NET深入解析LINQ框架(四:IQueryable、IQueryProvider接口详解)

LINQ查询Object是基于IEnumerable对象,不是集合对象什么好查。...2.2】.通过继承IEnumerable接口 我想大部分情况下我们都是直接使用IEnumerable实现类,但是在编写系统组件、框架时候一般都是要自己去实现自己迭代。...很多场合下我们需要自己去构建延迟加载特性功能,在IEnumerable对象中构建延迟基本上是通过yield return 去构建一个状态机,当进行迭代时候才进行数据返回操作。...} 这是IQueryable接口中从IEnumerable继承下来两个返回IEnumerator接口类型方法,在我们目前使用Linq to Sql、Linq to Entity中都会返回强类型集合对象...方法返回类型也是IQueryable类型,返回类型扩展类型相同就已经构成链式编程最小环路。

1.4K11
领券