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

IEnumerable <T>提供了两个GetEnumerator方法 - 它们之间有什么区别?

在C#中,IEnumerable<T>接口提供了两个GetEnumerator()方法,它们之间的区别主要在于返回的枚举器类型。

  1. IEnumerator<T> GetEnumerator():这个方法返回一个泛型的IEnumerator<T>,它用于枚举实现了IEnumerable<T>接口的集合。这个方法在迭代集合时,可以访问集合中的每个元素。
  2. IEnumerator GetEnumerator():这个方法返回一个非泛型的IEnumerator,它也用于枚举实现了IEnumerable<T>接口的集合。与泛型方法相比,这个方法在迭代集合时,无法访问集合中的具体元素,而只能访问它们的基本类型。

在实际使用中,泛型方法更为常用,因为它提供了更强类型的安全性和更好的性能。非泛型方法主要用于向后兼容,以支持旧的代码。

推荐的腾讯云相关产品和产品介绍链接地址:

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

相关·内容

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

IEnumerator IEnumerator、IEnumerable接口相似的名称,这两个接口通常也在一起使用,它们不同的用途。...IEnumerator接口为类内部的集合提供迭代方式, IEnumerator 要求你实现三个方法: MoveNext方法:该方法将集合索引加1,并返回一个bool值,指示是否已到达集合的末尾。...Current方法: 返回position位置的当前对象 IEnumerable IEnumerable接口为foreach迭代提供支持,IEnumerable要求你实现GetEnumerator方法...因此IEnumerable接口的GetEnumerator方法会返回一个IEnumerator接口。要实现IEnumerable,你还必须实现IEnumerator。...为IEnumerator的Current方法提供异常处理。 为什么要这么做?

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

    LINQ查询Object是基于IEnumerable对象的,不是集合对象什么好查的。...其实也就是两点可以扩展,要么提供扩展方法来扩展IEnumerable对象,当然你别企图想让VS支持某种关键字让你对应扩展方法。...如果我们是直接使用系统提供IEnumerable对象的话,只需要构建IEnumerable对象的扩展方法就能实现对集合类型的扩展。...IQueryable继承自IEnumerable接口,也就是可以被foreach语法调用的,但是在GetEnumerator方法中才会去执行提供程序的代码。...方法中有两个判断,第一个是判断是否是通过扩展方法方式调用代码的,防止我们直接使用扩展方法,第二个判断是确定我们是否提供表达式。 那么重点是最后一行代码,它包裹着几层方法调用,到底是啥意思呢?

    1.5K11

    认真CS☀️枚举器

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

    4510

    C# 常用接口学习 IEnumerable

    public interface IEnumerable : IEnumerable { new IEnumerator GetEnumerator();...2、继承接口IEnumerable: 当我们在类后面加上:IEnumerable后,Visual Studio IDE会冒出来一个小黄灯泡,点进去提示自动填充接口的约定,我们选第一项实现接口(Visaul...但根据MSDN上面的说法,Reset 方法提供的 COM 互操作性。它不一定需要实现;相反,实施者只需抛出NotSupportedException。...(好像装箱的行为) 第三,在MoveNext方法内累加索引,并从元素集中读取元素。然后让索引值超出元素集返回个false值。 最后,在Reset方法内让索引值为-1,不过好像直接抛出错误也成。...不过我们也自己实现一个GetEnumerator(),了解了枚举器的工作原理。本章学习目的达成。

    79030

    IEnumerable AND IEnumerator

    目前我们知道它俩是不一样的东西,至少从单词层面(ง •_•)ง。那么在 DotNET 中,它们扮演着怎么样的角色呢? 先来看看它们的样子: ? ?...IEnumerable说:我提供公开枚举器,并且该枚举器支持在非泛型集合上进行简单迭代的功能。 IEnumerator说:我提供支持对非泛型集合进行简单迭代的功能。...其实看接口的样貌我们就大概能够理解其中的奥秘IEnumerable 提供可以迭代的能力,而这种能力是通过内部的可迭代对象来实现,这个对象就是IEnumerator。...那么这种具有可迭代能力的对象什么好处呢? foreach,没错,它可以享受foreach的语法糖啦。...{ Console.WriteLine(enumeratorLst.Current); } 所以,一层一层的抽丝剥茧,原来脱掉了品如的衣服之后,内部居然是用了IEnumerator的各个属性与方法之间的协作

    38230

    5-迭代器

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

    50850

    迭代器模式

    一般实现一个集合的方法:数组,链表,哈希表等等,每种集合因为底层实现不同,遍历集合的方法也不同。...迭代器模式在客户访问类与集合类之间插入一个迭代器,这分离了聚合对象与其遍历行为,对客户也隐藏其内部细节,且满足“单一职责原则”和“开闭原则”。...其中IEnumerator接口扮演的就是迭代器角色,IEnumberable接口则扮演的就是抽象聚集的角色,只有一个GetEnumerator()方法,关于这两个接口的定义可以自行参考MSDN。...此接口至关重要,因为至少必须实现IEnumerable方法,才支持迭代集合。IEnumerable和IEnumerator接口的类图: ?...这样实现的好处在集合类不直接支持IEnumerator接口,而是直接支持另一种接口IEnumerable,其唯一方法GetEnumerator。此方法用于返回支持 IEnumerator的对象。

    64730

    IEnumerable 使用foreach 详解

    其中IEnumerable只有一个返回IEnumerator的GetEnumerator方法。而IEnumerator中有两个方法加一个属性。...接下来开发画瓢,我们继承IEnumerable接口并实现: ? 下面使用原始的方式调用: ? 朋友开始说了,我们平时都是通过foreache来取值的,没有这样使用过啊。...所以要可以foreach只需要对象定义GetEnumerator无参方法,并且返回值是IEnumerator或其对应的泛型。细看下图: ? 也就是说,只要可以满足这三步调用即可。...yield的使用 你肯定发现我们自己去实现IEnumerator接口还是有些许麻烦,并且上面的代码肯定是不够健壮。对的,.net给我们提供更好的方式。 ?...我们继续来看GetEnumerator的定义和调用: ? 我们调用GetEnumerator的时候,看似里面for循环一次,其实这个时候没有做任何操作。

    1.7K40

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

    Stack 当需要使用后进先出顺序(LIFO)的数据结构时,.NET为我们提供Stack。Stack 类提供Push和Pop方法来实现对Stack的存取。...Queue 当我们需要使用先进先出顺序(FIFO)的数据结构时,.NET 为我们提供Queue。Queue类提供Enqueue和Dequeue方法来实现对Queue的存取。...IEnumerable的派生类:小结 访问方式 继承自 特点 IEnumerable 通过ElementAt 无 所有泛型集合都继承自此接口 非泛型版本 提供遍历(通过GetEnumerator...) linq的基础,很多linq命令都是他的扩展方法 ICollection 通过ElementAt IEnumerable 所有泛型集合都继承自此接口 非泛型版本 提供Count...IEnumerable是整个LINQ的基础。整个LINQ都基于IEnumerable的扩展方法之上。C#大部分数据结构都实现IEnumerable

    1.7K20

    C#语言各种集合介绍

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

    62021

    认真CS☀️yield迭代

    迭代器需引用System.Collections.Generic命名空间 迭代方法1:迭代器创建枚举器 移除C#1.0的枚举器方法PeopleEnum,在继承IEnumerable接口的People...方法不再需要枚举器,而是内部的迭代器yield return语句告诉编译器来自动为我们创建枚举器,yield return语句指定枚举器中下一个可枚举项 C#1我们要写单个类、IEnumerable...接口的实现类(内有GetEnumerator方法)、枚举器类,才能在Main方法实例该类数组遍历它, C#2我们仅写单个类、IEnumerable接口的实现类,不必写枚举器类,便可在Main方法实例该类数组并遍历它...:如果不实现总类的GetEnumerator方法,Main方法直接采用IEnumerable类型的迭代器(内有GetEnumerator方法),那么就不需要总类的GetEnumerator方法 using...方法,因为可枚举类型的GetEnumerator方法主体固定格式,无法再次写个GetEnumerator方法,那样就会重名,且Main方法调用的也不知是哪个正确的GetEnumerator方法 一个类产生多个可枚举类型

    7610

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

    先来看一下IEnumerable接口,其实看过这个接口之后,发现它其实是非常的简单,只包含一个方法GetEnumerator(),它返回一个可用于循环访问集合的IEnumerator对象,如下面截图所示...image.png 从上面我们知道IEnumerator接口定义一个Current属性,MoveNext和Reset两个方法,这是多么的简约。既然IEnumerator对象是一个访问器。...其实我定义的两个接口使用的是IMyEnumerable和IMyEnumerator,这里你直接可以去掉My那么就是微软类库里面的接口,我这里只是自定义罢了,然后我自己定义接口的方法属性,没有严格按照微软的接口进行定义...接口   2、第二个方案是:这个类一个public的GetEnumerator的实例方法(不用继承IEnumerable实现接口),并且返回类型中有public 的bool MoveNext()实例方法和...实现IEnmerable接口的集合,是强类型的。它为子对象的迭代提供类型更加安全的方式。 自己实现下,感觉还是懂了一些,虽然还没有彻底的搞明白,但最起码大概知道怎么回事

    57020

    C# 学习笔记(10)—— 可空类型、匿名方法、迭代器

    会被编译成Nullable类型,即可空类型 public struct Nullable where T : struct { ... } 下面演示一下使用方法 static void...因为foreach就需要一个迭代器,IEnumerable接口中定义一个GetEnumerator方法用来返回迭代器,类型如果实现IEnumerable接口,则也必须实现GetEnumerator方法...,因此也就可以使用foreach语句 在 C# 1.0 中,要获取迭代器,就必须要实现 IEnumerableGetEnumerator 方法;而要实现一个迭代器,就必须要实现IEnumerable...然而在 C# 2.0 中,微软提供yield关键字来简化迭代器的实现,这使得自定义迭代器变得容易很多。...,它的作用就是告诉编译器,GetEnumerator方法不是一个普通方法,而是实现迭代器的方法

    17230
    领券