首页
学习
活动
专区
工具
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(迭代器对象),实现该接口必须实现以下三个方法/属性: ?

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

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

    1.6K90

    认真CS☀️枚举器

    实现了IEnumerator接口的类称为枚举器 IEnumerator接口 using System.Runtime.InteropServices; namespace System.Collections...2、枚举器实现了IEnumerator接口,所以它能做IEnumerator接口定义的所有工作 3、对于有枚举器的类型而言,必须有一个方法来获取它,获取一个对象枚举器的方法是调用对象的GetEnumerator...ie,GetEnumerator()方法获取到的是返回的枚举器的实例 调用方法时MoveNext要在前,Current方法在后。...它们的次序问题我们将通过下个综合实例观察 IEnumerable接口 using System.Runtime.InteropServices; namespace System.Collections...[DispId(-4)] IEnumerator GetEnumerator(); } } 可枚举类是指实现了IEnumerable接口的类,IEnumearable接口只有一个成员

    4610

    CA1010:集合应实现泛型接口

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

    60950

    了解LINQ

    本文主要的是泛谈LINQ是啥?以及常见的用法大纲如下: LINQ的那些根基 LINQ的一些基本用法 LINQ的根基 IEnumerable和IEnumerator 为啥能够被foreach?...实际上,能够被foreach的对象,一定是实现了带有返回值的IEnumerator的GetEnumerator()方法的接口,而.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

    89920

    从yield关键字看IEnumerable和Collection的区别

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

    79180

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

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

    3K20

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

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

    59620

    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 接下篇:《再讲IQueryableT>,揭开表达式树的神秘面纱》

    1.8K40

    C#内建接口:IEnumerable

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

    87020

    C#-IEnumerator与IEnumerable

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

    90220
    领券