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

IEnumerable/IEnumerable <T>接口只有MoveNext的原因是什么?

在C#中,IEnumerableIEnumerable<T>接口只有MoveNext方法的原因是它们是用于实现迭代器的。迭代器允许开发者在遍历集合时,按需生成元素,而不是一次性将所有元素加载到内存中。

MoveNext方法用于在每次迭代时将枚举器移动到下一个元素。如果成功移动到下一个元素,MoveNext方法返回true,否则返回false

IEnumerableIEnumerable<T>接口的定义如下:

代码语言:csharp
复制
public interface IEnumerable
{
    IEnumerator GetEnumerator();
}

public interface IEnumerable<out T> : IEnumerable
{
    IEnumerator<T> GetEnumerator();
}

IEnumerable接口包含一个名为GetEnumerator的方法,返回一个IEnumerator对象。IEnumerable<T>接口继承自IEnumerable接口,并添加了一个泛型的GetEnumerator方法,返回一个IEnumerator<T>对象。

因此,IEnumerableIEnumerable<T>接口只包含MoveNext方法,是为了支持迭代器模式。这种设计允许开发者在遍历集合时,按需生成元素,提高了内存效率。

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

相关·内容

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

原因是C#中自定义集合类型要实现foreach功能,必须通过IEnumerator和IEnumerable两个接口来实现!...2、通过IEnumerator和IEnumerable两个接口实现自定义集合类型foreach循环功能....第一步:实现自定义集合类型实现IEnumerable接口,实现该接口字面意思可以理解为:自定义集合类型实现了该接口,就拥有了"可枚举功能".代码如下: ?...实现了IEnumerable接口之后,发现该接口规定必须返回一个IEnumerator接口(迭代器对象).ok,那么就必须返回一个IEnumerator,那么它是什么呢?别急,下面开始介绍这个接口!...第二步:通过IEnumerable要求实现GetEnumerator()方法返回一个IEnumerator(迭代器对象),实现该接口必须实现以下三个方法/属性: ?

900100

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

也就是说,一旦我们在一个返回类型为IEnumerable或者IEnumerable方式中通过yield return返回集合元素,意味着这个定义在方法中操作会被“延后执行”——操作真正执行不是发生在方法调用时候...对于上面这个例子来说,不管GetItems方法中以何种方式返回需要对象,返回值总归是一个实现了IEnumerable 接口某个类型对象,我们只需要看看这个类型具有怎样定义就知道C...原因很简单——两段代码抛出异常时机是不一样。...,但是目前来说为了避免这样问题,我推荐将WCF契约接口操作方法中返回类型定义成数组,而不是IEnumerable或者IEnumerable(顺便说一下,WCF针对Array、List以及其他集合类型序列化.../反序列化行为是一致),但是我个人对IEnumerable或者IEnumerable不排斥。

1.5K90

了解LINQ

本文主要是泛谈LINQ是啥?以及常见用法大纲如下: LINQ那些根基 LINQ一些基本用法 LINQ根基 IEnumerable和IEnumerator 为啥能够被foreach?...实际上,能够被foreach对象,一定是实现了带有返回值IEnumeratorGetEnumerator()方法接口,而.NET内置接口则是IEnumerable,一般指的是IEnumerable...get; } bool MoveNext(); void Reset(); } Current:集合当前对象 MoveNext:是否能够移动到下一次...IEnumerable可被枚举集合 LINQ基本用法 扩展方法在LINQ应用:LINQ流式语法 LINQ方法一般都是通过扩展方法了扩展,就如最常用几个,Where,Any,例如,我实现了一个跟...: CAT DOG LINQ延迟执行:IQueryable 首先我们来看看IQueryable接口定义: public interface IQueryable : IEnumerable

86820

CA1010:集合应实现泛型接口

项 “值” RuleId CA1010 类别 设计 修复是中断修复还是非中断修复 非中断 原因 类型实现 System.Collections.IEnumerable 接口,但不能实现 System.Collections.Generic.IEnumerable... 接口和包含程序集目标 .NET。... 如何解决冲突 若要解决此规则冲突,请实现某个泛型集合接口: System.Collections.Generic.IEnumerable System.Collections.Generic.ICollection...允许接口格式: 仅接口名称(包括具有相应名称所有接口,不考虑包含类型或命名空间)。 完全限定名称,使用符号文档 ID 格式,前缀为 T:(可选)。...通过接口实现来解决 以下示例通过实现 IEnumerable、ICollection 和 IList 等泛型接口来解决冲突。

58250

从yield关键字看IEnumerable和Collection区别

为了避免不必要计算导致性能损失,和LINQ查询一样,yield关键字并不会导致后值语句立即执行,而是转换成一个“表达式”。只有等到需要那一刻(进行迭代)时候,表达式被才被执行。...,实现接口包括:IEnumerable, IEnumerable, IEnumerator, IEnumerator, IDisposable。...但是有的情况下,我们需要调用别人提供API来获取IEnumerable对象,我们不清楚对方有没有使用yield关键字。...在这种情况我个人常用做法就是调用ToArray或者ToList将其转换成T[]或者List,进而进行强制赋值。由于它们也实现了接口IEnumerable,所以不会存在什么问题。...IEnumerable这个接口和集合没有本质联系,只是提供“枚举”功能。甚至说,我们应该将IEnumerable对象当成“只读”,如果我们需要“可写”功能,你应该使用数组或者集合类型。

75880

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

IEnumerator IEnumerator、IEnumerable接口有相似的名称,这两个接口通常也在一起使用,它们有不同用途。...IEnumerator接口为类内部集合提供了迭代方式, IEnumerator 要求你实现三个方法: MoveNext方法:该方法将集合索引加1,并返回一个bool值,指示是否已到达集合末尾。...仅凭以上辞藻,很难区分两个接口使用场景。 IEnumerator接口定义对类中集合类型对象迭代方式, IEnumerable接口允许使用foreach循环进行枚举。...因此IEnumerable接口GetEnumerator方法会返回一个IEnumerator接口。要实现IEnumerable,你还必须实现IEnumerator。...“这也正是我们常见在foreach 里面尝试修改迭代对象会报InvalidOperationException异常原因

2.5K20

IEnumerable 使用foreach 详解

自己实现迭代器 .net中迭代器是通过IEnumerable和IEnumerator接口来实现,今天我们也来依葫芦画瓢。 首先来看看这两个接口定义: ? ? 并没有想象那么复杂。...我们还记得IEnumerator定义吗 ? 接口定义就只有get没有set。所以我们在foreach中不能修改item值。 我们再来回答第二个问题:“要实现foreach需要满足什么条件?”...: 必须实现IEnumerable接口?NO ? 我们自己写MyIEnumerable删掉后面的IEnumerable接口一样可以foreach(不信?自己去测试)。...我们调用GetEnumerator时候,看似里面for循环了一次,其实这个时候没有做任何操作。只有调用MoveNext时候才会对应调用for循环: ?...结束: demo下载:http://pan.baidu.com/s/1dE94c1b 接下篇:《再讲IQueryable,揭开表达式树神秘面纱》

1.7K40

C#基础知识系列九(对IEnumerable和IEnumerator接口糊涂认识)

前言    IEnumerable、IEnumerator到现在为止对这两个接口还是不太理解,不理解但是自己总是想着试着要搞明白,毕竟自己用少,所以在此先记录一下。...先来看一下IEnumerable接口,其实看过这个接口之后,发现它其实是非常简单,只包含一个方法GetEnumerator(),它返回一个可用于循环访问集合IEnumerator对象,如下面截图所示...它是一个真正集合访问器,没有它,就不能使用foreach语句遍历集合或数组,因为只有IEnumerator对象才能访问集合中项,假如连集合中项都访问不了,那么进行集合循环遍历是不可能事情了。...IEnumerable实现接口),并且返回类型中有public bool MoveNext()实例方法和publicCurrent实例属性。...实现了IEnmerable接口集合,是强类型。它为子对象迭代提供类型更加安全方式。 自己实现了下,感觉还是懂了一些,虽然还没有彻底搞明白,但最起码大概知道怎么回事了。

53620

C#-IEnumerator与IEnumerable

IEnumerable是所有可迭代非范型类基础接口IEnumerable包括一个方法GetEnumerator方法,方法返回一个IEnumerator。...IEnumerator是所有非范型迭代器基础接口。foreach语句隐藏了C#迭代器复杂实现。推荐使用foreach代替直接操作迭代器。 迭代器可以读取集合中数据,但是不能从底层修改集合。...初始时候,迭代器定位在集合第一个元素前面,在读取Current值之前需要调用一次MoveNext将迭代器驱动到第一个元素位置。...Current一直返回相同元素直到调用了MoveNext或者Reset方法。MoveNext将Current推进到下一个元素。...被遍历类通过实现IEnumerable接口和实现一个IEnumerator枚举器实现遍历功能。

86020

C#内建接口IEnumerable

这节讲一下接口IEnumerable。 01 什么是Enumerable 在一些返回集合数据接口中,我们经常能看到IEnumerable接口身影。那什么是Enumerable呢?...02 接口成员及使用示例 我们先来看接口中有什么,因为IEnumerable接口一般都是用其泛型版,我们直接看这种: 接口内容很简单,但是其中又出现了一个名为IEnumerator接口...,我们可以称之为枚举器,再来看看IEnumerator内部成员: IEnumerator接口有三个成员,Current就是保存的当前数据对象,MoveNext方法则是将指针指向下个对象(类似打疫苗情景中..."下一位"),Reset则是将指针复位,泛型版接口则对其内部名为Current成员指定了类型。...IEnumerable数据,所以请看如下代码: 拿到枚举器,我们就可以调用MoveNext找数据(为什么要先调用MoveNext,而不是先取值,再调用MoveNext寻找下一个数据,大家可以再次联想一下打疫苗情景

79720
领券