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

模拟IEnumerable <T>类型的GetEnumerator()方法

作为一个云计算领域的专家,我了解到IEnumerable<T>是一个泛型接口,用于遍历集合中的元素。它提供了一个GetEnumerator()方法,该方法返回一个枚举器,可以用于遍历集合中的每个元素。

在C#中,IEnumerable<T>接口是一个非常重要的接口,它是许多集合类型(如数组、列表和集合)的基础。它允许开发人员使用foreach循环来遍历集合中的每个元素。

以下是一个简单的示例,演示如何实现IEnumerable<T>接口并使用GetEnumerator()方法遍历集合中的元素:

代码语言:csharp
复制
using System;
using System.Collections;
using System.Collections.Generic;

class CustomCollection<T> : IEnumerable<T>
{
    private List<T> _items = new List<T>();

    public void Add(T item)
    {
        _items.Add(item);
    }

    public IEnumerator<T> GetEnumerator()
    {
        foreach (T item in _items)
        {
            yield return item;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

class Program
{
    static void Main(string[] args)
    {
        CustomCollection<int> collection = new CustomCollection<int>();
        collection.Add(1);
        collection.Add(2);
        collection.Add(3);

        foreach (int item in collection)
        {
            Console.WriteLine(item);
        }
    }
}

在这个示例中,我们创建了一个名为CustomCollection<T>的自定义集合类,它实现了IEnumerable<T>接口并提供了一个GetEnumerator()方法,该方法使用yield return语句返回一个枚举器,用于遍历集合中的每个元素。

Main方法中,我们创建了一个CustomCollection<int>实例,并向其中添加了一些元素。然后,我们使用foreach循环遍历集合中的每个元素,并将其打印到控制台上。

总之,IEnumerable<T>接口和GetEnumerator()方法是C#中用于遍历集合的重要组成部分,它们提供了一种通用的方式来遍历各种集合类型。

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

相关·内容

  • 认真CS☀️枚举器

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

    3810

    C# 常用接口学习 IEnumerable

    我们先去看看公开.Net4.0源程序中IEnumerableIEnumerable、IEnumerator和IEnumerator这四个接口是如何声明: 需加微信交流群,请加小编微信号...public interface IEnumerable : IEnumerable { new IEnumerator GetEnumerator();...迭代器工作原理是:先调用MoveNext()方法,然后读取Current得到元素,直到MoveNext返回false。 我们需要3个字段分别放置 元素位置、元素、元素集。...(好像有装箱行为) 第三,在MoveNext方法内累加索引,并从元素集中读取元素。然后让索引值超出元素集返回个false值。 最后,在Reset方法内让索引值为-1,不过好像直接抛出错误也成。...二、接口IEnumerable实现 如果我们想写一个通用可foreach类,用到泛型: class MyCollection { public List<

    77730

    认真CS☀️yield迭代

    2:迭代器创建可枚举类型 类a包含GetEnumerator方法和一个可枚举类型迭代器,该可枚举类型迭代器内部又自动实现了GetEnumerator方法和一个可枚举类型 要想遍历该类a,类aGetEnumerator...方法需获取可枚举类型GetEnumerator方法,从而获得可枚举类型迭代器内部枚举器 a、迭代器创建class类型 using System; using System.Collections.Generic...:如果不实现总类GetEnumerator方法,Main方法直接采用IEnumerable类型迭代器(内有GetEnumerator方法),那么就不需要总类GetEnumerator方法了 using...在一个类中产生多个可枚举类型,那么就不能能实现GetEnumerator方法,因为可枚举类型GetEnumerator方法主体有固定格式,无法再次写个GetEnumerator方法,那样就会重名,且...Main方法调用也不知是哪个正确GetEnumerator方法 一个类产生多个可枚举类型,而是采用不实现GetEnumerator方法,Main方法直接调用返回可枚举类型迭代器,即上文“b、不实现

    7310

    通过运行期类型检查实现泛型算法

    IEnumerable ,因此我们要实现序列中元素倒叙访问就必须采用 GetEnumerator方式。...首次调用这个方法时会把输入序列访问一遍,然后让嵌套类可以在这个列表上反向访问元素。...要解决这个问题我们只需要修改一下 DemoEnumerable 构造函数然后增加一个参数为 IList 类型构造函数即可: public DemoEnumerable(IEnumerable...有时尽管参数实现了 IList 但是它编译期类型仍然是 IEnumerable,因此我们必须提供新构造函数同时修改旧构造函数。...一、第二次优化 上述代码基本上囊括了大部分情况,但有时我们还会遇到一些集合只实现了 ICollection 而没有实现 IList 情况,这种情况下我们代码中 GetEnumerator 方法性能就不是很高了

    60810

    C#语言各种集合介绍

    接口,所以任何集合类对象都有一个GetEnumerator()方法,该方法可以返回一个实现了 IEnumerator接口对象,这个返回IEnumerator对象既不是集合类对象,也不是集合元素类对象...通过这个对象,可以遍历访问集合类对象中每一个元素对象 如果集合类是用户自定义集合类,则用户必须实现它GetEnumerator()方法,否则不能使用循环。...、可排序 缺点:插入时性能不如数组、不是强类型 2)BitArray 实现了接口:ICollection、IEnumerable 管理位值压缩数组。...)Queue 实现了接口:ICollection、IEnumerable Queque是队列,先进先出访问各个元素 可以调用Queque对象GetEnumerator()方法,得到IEnumerator...方法,得到IEnumerator对象,来遍历堆栈中各个元素 3.上面提到几种集合类,他们都是通用集合类,他们所接受元素大都是Object类型,当对象放入 了集合之后,都失去了原有的类型信息-即这些通用集合类都不是强类型

    61121

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

    IEnumerable派生类:小结 访问方式 继承自 特点 IEnumerable 通过ElementAt 无 所有泛型集合都继承自此接口 有非泛型版本 提供遍历(通过GetEnumerator...IEnumerable替代作为返回类型 IQueryable 通过IndexOf IEnumerable 从远端获得筛选之后资料,和IEnumerable不同,IQueryable...通常将迭代中拿出来元素称为iterator。 实现IEnumerable接口,必须实现它唯一方法GetEnumerator。...方法GetEnumerator返回一个IEnumerator类型输出。...IEnumerator类型又是一个接口,所以我们还要写一个类,并将这个类继承IEnumerator接口(实现它2个方法),建立这个类一个新实例,并传入一个数组(作为迭代源)作为方法GetEnumerator

    1.7K20

    编写高质量代码改善C#程序157个建议

    如果要实现一个自定义集合类,最好不要以List作为基类,而应该扩展相应泛型接口,通常是Ienumerable和ICollection(或ICollection子接口,如...建议24、迭代器应该是只读  前端时间在实现迭代器时候我就发现了这样一个问题,迭代器中只有GetEnumeratior方法,没有SetEnumerator方法。...这段代码问题就是:线程t1模拟将对类型StudentTeamAStudents属性进行赋值,它是一个可读/可写属性。...在例子中,我们将list赋值为null,模拟在StudentTeamA(或者说工作线程t1)不知情情况下使得集合属性变为null。...接着,线程t1模拟针对Students属性进行若干操作,导致异常抛出。

    57430

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

    会被编译成Nullable类型,即可空类型 public struct Nullable where T : struct { ... } 下面演示一下使用方法 static void...当把一个可空类型赋给引用变量时,CRL会对可空类型(Nullable)对象进行装箱处理。...因为foreach就需要一个迭代器,IEnumerable接口中定义了一个GetEnumerator方法用来返回迭代器,类型如果实现了IEnumerable接口,则也必须实现GetEnumerator方法...,因此也就可以使用foreach语句了 在 C# 1.0 中,要获取迭代器,就必须要实现 IEnumerableGetEnumerator 方法;而要实现一个迭代器,就必须要实现IEnumerable...,GetEnumerator方法不是一个普通方法,而是实现迭代器方法

    16730

    设计一个 .NET 可用弱引用集合(可用来做缓存池使用)

    你可以参考我另一篇博客了解设计这种不确定类型 API 时候一些指导: 如何为非常不确定行为(如并发)设计安全 API,使用这些 API 时如何确保安全 总结起来就是: 必须提供一个单一方法...,能够完成一些典型场景下某一时刻确定性状态获取 绝不能提供一些可能多次调用获取状态方法 那么这个原则怎么体现在此弱引用集合类型设计上呢?...IEnumerable IEnumerable 里面只有两个方法,看起来少多了,那么我们能用吗?...1 2 public IEnumerator GetEnumerator() => throw new NotImplementedException(); IEnumerator IEnumerable.GetEnumerator...对于并发可以使用锁,但对于弱引用,没有可以使用相关方法来快速解决问题。 因此,IEnumerable 也是不能继承。 object 看来,我们只能继承自单纯 object 基类了。

    15340

    C#12中Collection expressions(集合表达式语法糖)

    C#12中引入了新语法糖来创建常见集合。并且可以使用..来解构集合,将其内联到另一个集合中。 支持类型 数组类型,例如 int[]。...类型通过编写 Create() 方法,和对集合类型应用System.Runtime.CompilerServices.CollectionBuilderAttribute 选择加入集合表达式支持。...() => _buffer.AsEnumerable().GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => _buffer.GetEnumerator...LineBufferBuilder.Create方法必须返回 LineBuffer 对象,并且必须采用 ReadOnlySpan 类型单个参数。...其中,第一个参数提供生成器类名称, 第二个特性提供生成器方法名称。 这样一个自定义类就可以支持集合表达式了。

    16310

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

    还有就是继承IEnumerable对象让我们自己集合类型具备LINQ类型查询能力。当然具体要看我们需求,从技术角度看目前只有这两点可以扩展。...如果我们是直接使用系统提供IEnumerable对象的话,只需要构建IEnumerable对象扩展方法就能实现对集合类型扩展。...IQueryable继承自IEnumerable接口,也就是可以被foreach语法调用,但是在GetEnumerator方法中才会去执行提供程序代码。...} 这是IQueryable接口中从IEnumerable继承下来两个返回IEnumerator接口类型方法,在我们目前使用Linq to Sql、Linq to Entity中都会返回强类型集合对象...方法返回类型也是IQueryable类型,返回类型和扩展类型相同就已经构成链式编程最小环路。

    1.4K11

    切面获取泛型方法T真实类型

    制造问题是起头这三个泛型方法。如 selectByPrimaryKey这个方法,由于这是一个泛型方法,其返回值为T 。...而ServiceMock录制回放基本套路就是通过获取到被录制方法返回值类型来进行回放。...而如果是泛型方法,那么returnType结果就是“T”或者是”List”, 这也就意味着以下反序列化方法执行失败。...这样,只要获取到了切点中正在执行方法返回值(原始类型或者是某个类实例),然后根据返回值来获取到Class,并最终获取到Type。这样就可以继续愉快地进行反序列化了。...().equals("T") || returnType.getTypeName().equals("java.util.List")) { 对于T 或者是List泛型方法,就在执行时获取一下执行类型并记录

    2.3K30

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

    IEnumerator接口为类内部集合提供了迭代方式, IEnumerator 要求你实现三个方法: MoveNext方法:该方法将集合索引加1,并返回一个bool值,指示是否已到达集合末尾。...Current方法: 返回position位置的当前对象 IEnumerable IEnumerable接口为foreach迭代提供了支持,IEnumerable要求你实现GetEnumerator方法...仅凭以上辞藻,很难区分两个接口使用场景。 IEnumerator接口定义对类中集合类型对象迭代方式, IEnumerable接口允许使用foreach循环进行枚举。...因此IEnumerable接口GetEnumerator方法会返回一个IEnumerator接口。要实现IEnumerable,你还必须实现IEnumerator。...语法糖初次接触可枚举cars, 实际会访问cars实现 GetEnumerator()方法,拿到迭代器 foreach每次迭代,实际会访问迭代器Current属性

    2.7K20

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

    先来看一下IEnumerable接口,其实看过这个接口之后,发现它其实是非常简单,只包含一个方法GetEnumerator(),它返回一个可用于循环访问集合IEnumerator对象,如下面截图所示...直接对GetEnumerator()方法进行实现,然后返回IEnumerator即可。...,一个类型支持foreach遍历条件可以是:   1、第一个方案是:这个类实现IEnumerable接口   2、第二个方案是:这个类有一个publicGetEnumerator实例方法(不用继承...IEnumerable实现接口),并且返回类型中有public bool MoveNext()实例方法和publicCurrent实例属性。...实现了IEnmerable接口集合,是强类型。它为子对象迭代提供类型更加安全方式。 自己实现了下,感觉还是懂了一些,虽然还没有彻底搞明白,但最起码大概知道怎么回事了。

    56520
    领券