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

如果IEnumerable.GetEnumerator()是不同的返回类型,那么GetEnumerator()的主要实现如何返回GetEnumerator()呢?

如果IEnumerable.GetEnumerator()是不同的返回类型,那么GetEnumerator()的主要实现可以通过以下方式返回GetEnumerator():

  1. 首先,需要在实现类中定义一个私有的内部类,该内部类实现了IEnumerator接口,并且返回IEnumerable.GetEnumerator()所期望的类型。
  2. 在GetEnumerator()方法中,创建并返回该内部类的实例。

下面是一个示例代码:

代码语言:txt
复制
public class MyCollection<T> : IEnumerable<T>
{
    private List<T> items;

    public MyCollection()
    {
        items = new List<T>();
    }

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

    public IEnumerator<T> GetEnumerator()
    {
        return new MyEnumerator<T>(items);
    }

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

    private class MyEnumerator<U> : IEnumerator<U>
    {
        private List<U> collection;
        private int currentIndex;

        public MyEnumerator(List<U> collection)
        {
            this.collection = collection;
            currentIndex = -1;
        }

        public U Current => collection[currentIndex];

        object IEnumerator.Current => Current;

        public void Dispose()
        {
            // 清理资源
        }

        public bool MoveNext()
        {
            currentIndex++;
            return currentIndex < collection.Count;
        }

        public void Reset()
        {
            currentIndex = -1;
        }
    }
}

在上述示例中,MyCollection<T>实现了IEnumerable<T>接口,并且定义了一个私有的内部类MyEnumerator<U>,该内部类实现了IEnumerator<U>接口。在GetEnumerator()方法中,返回了MyEnumerator<T>的实例。

这样,无论IEnumerable.GetEnumerator()的返回类型是什么,GetEnumerator()方法都能够返回一个实现了IEnumerator接口的对象,以满足遍历集合的需求。

对于腾讯云相关产品和产品介绍链接地址,由于要求不能提及具体品牌商,无法给出相关链接。但是在云计算领域,可以考虑使用腾讯云的云服务器、云数据库、云存储等产品来支持应用的部署和数据存储需求。

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

相关·内容

C# 常用接口学习 IEnumerable

我们先去看看公开.Net4.0源程序中IEnumerable、IEnumerable、IEnumerator和IEnumerator这四个接口如何声明: 需加微信交流群,请加小编微信号...但是,如果您选择执行此操作,则应确保没有调用方依赖于Reset功能。 迭代器工作原理:先调用MoveNext()方法,然后读取Current得到元素,直到MoveNext返回false。...其次,我们要把object Current改成 IEnumerator.Current,这个实现迭代器关键。返回元素。...通过观察,发现迭代器主要就是返回一个元素对象,而StudentColletion里面的students元素集List,本身就能枚举,我们能不能利用这个不用专门写迭代器来实现枚举?...二、接口IEnumerable实现 如果我们想写一个通用可foreach类,用到泛型: class MyCollection { public List<

79030

dotnet 不申请额外数组空间合并多个只读数组列表

我在写一个简单功能,需要将两个不同数组合并到一起,但是我功能只是做只读,如果合并方法需要申请额外内存空间,将降低性能。...本文写了一个简单方法,通过判断下标的方法做遍历多个数组组合在一起,通过判断当前获取下标在对应哪个数组下标范围内,返回对应数组元素 合并多个数组或列表有多个不同方法,但是我找到方法都需要额外申请内存空间...,需要做一次数组元素复制,相对性能比较差,如果做只读,功能和 Span 相反,那么可以通过遍历数组下标判断 下面方法可以在项目用,做法很简单,看代码也就知道 using System; using...} IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator();...} IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator();

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

    所以如果要根据 ConditionalWeakTable 来实现弱引用集合那么需要自己记录集合中所有的 Key,而这样的话我们依然需要自己实现一个用来记录所有 Key 弱引用集合,相当于鸡生蛋蛋生鸡问题...设计原则 在设计此类型时候,有一个非常大需要考虑因素,就是此类型元素个数不确定如果设计不当,那么类型使用者可能写出每一行代码都是 Bug。...你可以参考我另一篇博客了解设计这种不确定类型 API 时候一些指导: 如何为非常不确定行为(如并发)设计安全 API,使用这些 API 时如何确保安全 总结起来就是: 必须提供一个单一方法...,能够完成一些典型场景下某一时刻确定性状态获取 绝不能提供一些可能多次调用获取状态方法 那么这个原则怎么体现在此弱引用集合类型设计上?...然而类型既然已经开放出去给大家使用了,那么这就非常危险。关键这不是一个并发场景,于是开发者可能更难感受到在同一个上下文中调用两个方法将得到不确定结果。

    16240

    探索c#之不可变数据类型

    var str="mushroomsir"; str.Substring(0, 6) c#中string不可变,Substring(0, 6)返回一个新字符串值,而原字符串在共享域中不变。...我们平常使用数据结构都是采用可变模式来实现,那怎么实现一个不可变数据结构!...() { yield break; } IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); }...() { return this.GetEnumerator(); } } 入栈时会实例化一个新栈对象 将新值通过构造函数传入,并存放在新对象Head位置,旧栈对象放在在Tail位置引用 出栈时返回当前栈对象...Net提供不可变集合 不可变队列,不可变列表等数据结构如果都自己实现工作量确实有点大。幸好Net在4.5版本已经提供了不可变集合基础类库。

    1K40

    小解c# foreach原理

    公共定义,因此 foreach 语句不能作用于 “Cat” 类型变量,由此错误提示我们可以得知如果 Cat 类型可以被 foreach 遍历,那么 Cat 类就必须实现 GetEnumerator...但是我们目前并不知道 GetEnumerator 方法返回类型和 Current 属性是否只读,这种情况我们该怎么办?...此时我们可以查看已经支持 foreach 遍历类型怎么做,下面的代码段展示了 string 类型如何实现(只列出了关键代码)。...() { return new CatEnumerator(); } } 我们已经添加了数据对象,那么 foreach 如何访问到这个数据?...小技巧:在 c# 中如果要查看某个类型是否支持 foreach 我们可以查看还类型和该类型迭代计数器是否都实现了 IEnumerable 接口,因为 IEnumerable 接口中就包含了 foreach

    62110

    小解c# foreach原理

    公共定义,因此 foreach 语句不能作用于 “Cat” 类型变量,由此错误提示我们可以得知如果 Cat 类型可以被 foreach 遍历,那么 Cat 类就必须实现 GetEnumerator...但是我们目前并不知道 GetEnumerator 方法返回类型和 Current 属性是否只读,这种情况我们该怎么办?...此时我们可以查看已经支持 foreach 遍历类型怎么做,下面的代码段展示了 string 类型如何实现(只列出了关键代码)。...() { return new CatEnumerator(); } } 我们已经添加了数据对象,那么 foreach 如何访问到这个数据?...小技巧:在 c# 中如果要查看某个类型是否支持 foreach 我们可以查看还类型和该类型迭代计数器是否都实现了 IEnumerable 接口,因为 IEnumerable 接口中就包含了 foreach

    1K11

    C#2.0新增功能05 迭代器

    编译器隐式调用 GetEnumerator 方法,此方法返回 IEnumerator。 GetEnumerator 方法通过使用 yield return 语句每次返回 1 个字符串。...Push 方法将值分配给类型为 T 数组。 GetEnumerator 方法通过使用 yield return 语句返回数组值。...必须存在从 yield return 语句中表达式类型到迭代器返回 IEnumerable 类型参数隐式转换。 在 C# 中,迭代器方法不能有任何 in、ref 或 out 参数。...技术实现 即使将迭代器编写成方法,编译器也会将其转换为实际上状态机嵌套类。 只要客户端代码中 foreach 循环继续,此类就会跟踪迭代器位置。...避免在 foreach 循环第一次迭代之前完全加载大型列表。 一个示例用于加载一批表格行分页提取。

    72150

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

    设计Enumerable和Queryable两套接口原因是为了区别对待LINQ to OBJECTS、LINQ to SQL,两者对于查询处理在内部使用完全不同机制。...可以发现以上方式实现排序至少存在两个问题: 1)可扩展性太低,如果存在新排序要求,就必须实现比较器。 2)对代码侵入性太高,为类型继承了接口,增加了新 方法。...那么有没有一种方法,即使类型只存在自动实现属性,也能满足多方面的排序要求?答案使用LINQ。LINQ提供了类似于SQL语法来实现遍历、筛选与投影集合功能。借助于LINQ强大功能。  ...建议31、在LINQ查询中避免不必要迭代  无论SQL查询还是LINQ查询,搜索到结果立刻返回总比搜索完所有的结果再将结果返回效率要高。现在简单来创建一个自定义集合类型来说明。...与First一样,它满足条件以后,会从当前迭代过程直接返回,而不是等到整个迭代过程完毕再返回如果一个集合包含了很多元素,那么这种查询会为我们带来可观时间效率。

    95650

    认真CS☀️yield迭代

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

    7610

    .NET面试题系列 - IEnumerable

    实现了这个接口类可以使用Foreach关键字进行迭代(迭代意思对于一个集合,可以逐一取出元素并遍历之)。实现这个接口必须实现方法GetEnumerator。...如何实现一个继承IEnumerable类型实现一个继承IEnumerable类型等同于实现方法GetEnumerator。...想知道如何实现方法GetEnumerator,不妨思考下实现GetEnumerator之后类型在Foreach之下行为: 可以获得第一个或当前成员 可以移动到下一个成员 可以在集合没有下一个成员时退出循环...实现方法GetEnumerator GetEnumerator方法需要一个IEnumerator类型返回值,这个类型一个接口,所以我们不能这样写: return new IEnumerator();...使用yield关键字实现方法GetEnumerator 如果iterator本身有实现IEnumerator接口(本例就是一个数组),则可以有更容易方法: public IEnumerator

    64720

    C Sharp(十三)

    枚举器和可枚举类型 为什么数组可以使用 foreach ?因为数组可以提供一个枚举器(enumerator)对象。枚举器对象可以依次返回数组元素。...获取一个对象枚举器可以调用对象 GetEnumerator 方法。实现GetEnumerator 方法对象称为可枚举(enumerable)对象。...foreach 语句就是用来配合可枚举类型一起使用,他会执行下列行为: 调用 GetEnumerator 方法获取对象枚举器 从枚举器请求每一项作为迭代变量(iteration variable)...current = (int)ie.Current; Console.WriteLine(current); } } } IEnumerable 可枚举类型实现了...泛型与非泛型版本主要区别是: IEnumerable 接口 GetEnumerator 方法要返回实现 IEnumerator 接口枚举器实例 泛型版本 Current 属性返回不是 object

    59720
    领券