C#--- IEnumerable<T>和yield return的使用

C#学习笔记-yield和迭代器相关 目录定义使用迭代器 在等美术给资源才能进行下一步工作,看看之前的代码,想起来还有一个yield关键字没有梳理过,摸鱼写博客。。。也算工作吧,毕竟还是要 用C#的 官方文档 c# yield关键字的用法 C# 中的"yield"使用 C# 中yield 的用法以及性能提升 详解C# 迭代器 定义 如果你在语句中使用 yield 上下文关键字,则意味着它在其中出现的方法、运算符或 get 访问器是迭代器。 通过使用 yield 定义迭代器,可在实现自定义集合类型的 IEnumerator<T> 和 阅读详情
代码分析:
(1).注意第17行,MyColl<T>的构造函数不能写成MyColl<T>...
(2).24的IEnumerable<T> GetEnumerator()来自IEnumberable<T>,  而29行的IEnumerable.GetEnumerator()来自IEnumberable。
    在泛型时候,调用第24行。但是为什么要写29行呢?因为IEnumberable<T>本身继承自  IEnumberable,即    
    public interface IEnumerable<T> : IEnumerable
    {
        IEnumerator<T> GetEnumerator();
    }
    public interface IEnumerable
    {
        IEnumerator GetEnumerator();
    }
(3).第26行的NestEnum是新建的一个类,继承自IEnumerator<T>。在类NestEnum中。
     
    T Current{get;}继承自IEnumerator<T>
    object Current { get; }   bool MoveNext();    void Reset();继承自IEnumerator
    void Dispose()继承自IDisposable
    如下

    public interface IEnumerator<T> : IDisposable, IEnumerator

(4).调用顺序是:一旦获得枚举器,它首先调用MoveNext,然后使用Current的返回值初始化变量n,如此开始循环。如果循环没有其他的出口路径,循环将持续下去直到MoveNext返回false。这是枚举器结束遍历,然后调用Dispose函数。reset一直没有被调用,我猜想可能是应该在类内部处理特殊情况的


[csharp] view plaincopy

    using System;  
    using System.Collections;  
    using System.Collections.Generic;  
    using System.Text;  
    using System.IO;  
    using System.Windows.Forms;  
    using System.Xml;  
    using System.Reflection;  
    using System.Threading;  
    using System.Drawing;  
    using System.Collections.Specialized;  
    namespace CSharpConsole  
    {  
        public class MyColl<T>:IEnumerable<T>  
        {  
            public List<T> arr = new List<T>();  
            public MyColl(T t1,T t2,T t3,T t4)  
            {  
                arr.Add(t1);  
                arr.Add(t2);  
                arr.Add(t3);  
                arr.Add(t4);  
            }  
            public IEnumerator<T> GetEnumerator()//这个函数来自IEnumerable<T>  
            {  
                return new NestEnum<T>(this);  
            }  
      
            IEnumerator IEnumerable.GetEnumerator()//这个函数来自IEnumerable  
            {  
      
                return GetEnumerator();  
            }  
        }  
        public class NestEnum<T> : IEnumerator<T>  
        {  
            public NestEnum(MyColl<T> coll)  
            {  
                this.coll = coll;  
                this.index = -1;  
                Console.WriteLine("CON");  
            }  
            public T Current//这个函数来自IEnumerator<T>  
            {  
                get  
                {  
                    Console.WriteLine("CURRENT T");  
                    return current;  
                }  
            }  
            public void Dispose()//这个函数来自IDisposable  
            {  
                Console.WriteLine("DISPOSE");  
             }  
            object IEnumerator.Current//这个函数来自IEnumerator  
            {  
                get  
                {  
                    Console.WriteLine("CURENT IENUMBLE");  
                    return Current;   
                }  
            }  
            public bool MoveNext()//这个函数来自IEnumerator  
            {  
                Console.WriteLine("MOVE");  
                index++;  
                if (index == coll.arr.Count)  
                    return false;  
                else  
                {  
                    current = coll.arr[index];  
                    return true;  
                }  
            }  
            public void Reset()//这个函数来自IEnumerator  
            {  
                Console.WriteLine("RESET");  
                current = default(T);  
                index = 0;  
            }  
            private MyColl<T> coll;  
            private int index;  
            private T current;  
        }  
        public class Program  
        {  
            public static void Fun()  
            {  
                MyColl<int> col = new MyColl<int>(1, 2, 3, 4);  
                foreach (int i in col)  
                {  
                }  
            }  
            static void Main()  
            {  
                Fun();  
                Console.WriteLine("-----------------------------------------");  
                MyColl<int> col=new MyColl<int>(1,2,3,4);  
                foreach (int i in col)  
                {  
      
                }  
                Console.WriteLine("-----------------------------------------");  
                foreach (int i in col)  
                {  
      
                }  
            }  
        }  
    }  

[csharp] view plaincopy

    </pre><pre name="code" class="csharp">  

[csharp] view plaincopy

    </pre><pre name="code" class="csharp">  

[csharp] view plaincopy

    </pre><pre name="code" class="csharp">  

如果用yield return的话,就变的简单多了,只要修改一个函数如下;而且NestEnum的类都不需要了
[csharp] view plaincopy

            public IEnumerator<T> GetEnumerator()//这个函数来自IEnumerable<T>  
            {  
                for (int i = 2; i < arr.Count; i++)  
                    yield return arr[i];  
                for (int i = 0; i < 2; i++)  
                    yield return arr[i];  
            }  

[csharp] view plaincopy

    </pre><p>yield return还有一种不放在类里的用法,很奇怪,注意函数返回值只能是IEnumerable<T>或者是IEnumerable 不能使IEnumerator<T>和IEnumerator,因为需要返回值里面有</p><p>GetEnumerator()方法</p><p><pre name="code" class="csharp">    public class Program  
        {  
            static void Main()  
            {  
                List<int> intlist = new List<int>();  
                intlist.Add(1);  
                intlist.Add(2);  
                intlist.Add(3);  
                intlist.Add(4);  
      
                foreach(int n in CreateReverseIterator(intlist))  
                {  
                    Console.WriteLine(n);  
                }  
            }  
            static IEnumerable<T> CreateReverseIterator<T>(IList<T> list)  
            {  
                int count = list.Count;  
                for (int i = count - 1; i >= 0; i--)  
                {  
                    yield return list[i];  
                }  
            }  
        } 

C#集合-列举(Enumeration) 在计算机这个范畴内存在许多种类的集合,从简单的数据结构比如数组、链表,到复杂的数据结构比如红黑树,哈希表。尽管这些数据结构的内部实现和外部特征大相径庭,但是遍历集合的内容确是一个共同的需求。.NET Framework通过IEnumerable和IEnumerator接口实现遍历集合功能。 Non-Generic Generic 备注 IEnumerator IEnumer... 阅读详情

相关推荐

UCIe物理层 —— 逻辑协议 (2)

本章开始主要介绍UCIe协议第四章,物理层逻辑定义和规范。如其他的通信协议一样,接口的物理层包含两个部分,逻辑子层和电气子层。其中逻辑层主要负责:1.定义接口信号和时序2. 定义发送端如何将上层数据分发到各个物理通道以及接收端如何把从各个通道收到的数据恢复成byte stream(Flit)。3. Broken Lane的repair和remap。4. 链路初始化,训练(training)和电源状态管理/切换。5. 扰码Scrambling和training sequence的产生。

m0_47581558的博客 1477

C# 语言增强特性

C# 语言增强特性第一章中,我们回顾了LINQ背后的动机并介绍了一些代码使你对LINQ有一个整体的印象。本章中,我们将使用LINQ查询直接在编程语言中编写成为可能的语言扩展。LINQ使用新的构造扩展了C#,在我们学习LINQ之前,知道这些语言特性是很重要的。本章是彻底了解LINQ的基石。但是请注意,这些功能强大的新特性不只是可以运用在LINQ当中,也可以应用在其他场景当中。我们不会对每

草莽的专栏 2940

FOC控制必看:单/双/三电阻电流采样方案全对比(附NXP实战避坑指南)

本文深入对比了FOC控制中单电阻、双电阻和三电阻电流采样方案的优劣与适用场景,重点剖析了采样时序、窗口与ADC转换的工程挑战。针对NXP平台,提供了解决采样窗口过窄的实战方案与配置指南,帮助工程师根据成本与性能需求做出最优选择,并规避常见设计陷阱。

n2o3p4的博客 411

C#IEnumberable<>

IEnumerable接口定义了一个名为GetEnumerator的方法,该方法返回一个实现了IEnumerator接口的枚举器。IEnumerator接口提供了对集合中元素的访问和操作,它包含了MoveNext、Current和Reset等方法,用于在集合上进行迭代。在C#中,IEnumerable是一个泛型接口,用于表示一个可枚举的集合。在Main方法中,我们创建了一个MyCollection实例,并使用foreach语句遍历集合中的元素并输出到控制台。方法中,我们创建了一个。

ultramand的博客,重生之我在cad上二次开发猛猛敲C#代码~ 2292

EXCEL实现分层自定义比例随机抽样(图+文教程)

EXCEL实现分层自定义比例随机抽样(图+文教程) 单一字段分层自定义比例随机抽样 多字段分层自定义比例随机抽样 单一字段分层自定义比例随机抽样 首先数据源如下,我们想随机抽张三的金额数据10%、李四金额20%、王五5%、哈哈15%、李六10% 首先第一步,添加辅助列,随机数 =RAND() 对数据进行高级排序 升序、降序都可以 添加辅助列...

可乐联盟 2万+

三维重建之条纹投影结构光(三)——相位展开优化与多频外差实践

本文深入探讨了三维重建中条纹投影结构光技术的核心环节——相位展开优化。针对传统路径跟踪法存在的误差传播与路径依赖问题,重点解析了多频外差法的原理与优势,并通过详细的C++代码实践,展示了如何利用三频外差法实现鲁棒、高精度的相位展开,从而获得连续的绝对相位图,为后续三维点云生成奠定坚实基础。

weixin_29074295的博客 529

C# 常用接口学习 IEnumerable<T>

我们先去看看公开的.Net4.0的源程序中IEnumerable<T>、IEnumerable、IEnumerator<T>和IEnumerator这四个接口是如何...

zls365365的博客 3253

Windows应急响应实战:灰鸽子木马检测与清除全流程解析

远程控制木马(RAT)是一种基于客户端/服务器(C/S)架构的恶意软件,攻击者通过它能够远程操控受害主机,实现屏幕监控、文件窃取、键盘记录等操作,对个人隐私与企业数据安全构成严重威胁。其技术原理通常涉及进程注入、网络通信、持久化机制等核心环节,在应急响应中具有极高的分析价值。掌握此类木马的检测与清除方法,是Windows系统安全防护与事件处置的基本功。本文以经典的灰鸽子木马为例,结合进程分析、网络排查、注册表检查等实战技术,系统讲解从行为识别、痕迹取证到彻底清除的完整操作流程,并涵盖Rootkit对抗、无文

weixin_30521161的博客 413

IEnumerable 与 IEnumerable<T>

转自:https://blog.youkuaiyun.com/qq_21419015/article/details/80495322 IEnumerable 和IEnumerable<T> 接口在 .NET 中是非常重要的接口,它允许开发人员定义foreach语句功能的实现并支持非泛型方法的简单的迭代,IEnumerable和IEnumerable<T>接口是 .N...

weixin_30849403的博客 413

SAP CKMLCP 月结7大常见报错:从“未找到成本核算运行”到“物料占用”的完整解决方案

本文深入解析SAP CKMLCP月结过程中的7大常见报错,从权限问题到数据一致性错误,提供系统化的解决方案。重点解决'未找到成本核算运行'和'物料占用'等典型问题,帮助财务人员高效完成成本核算月结,确保数据准确性。

weixin_30299709的博客 415

51单片机矩阵键盘——LCD1602显示

矩阵键盘扫描(输入扫描) 原理:读取第1行(列)→读取第2行(列) →读取第3行(列) → ……,然后快速循环这个过程,最终实现所有按键同时检测的效果 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态。

YLG_lin的博客 9853

C#中的yield

讲解 在 C# 基础库中经常可以看到很多方法返回值是 IEnumerable 类型,那么为什么返回 IEnumerable 而不是返回 IList、ICollection 或 List 类型呢?看完这篇文章你就能得到答案了。IEnumerable 它表示该集合中的元素可以被遍历,一般来说 IEnumerable 类型的对象会和 yield 紧密结合和。在 C# 中大部分方法是通过 return 语句把运行果返给调用者,同时把控制权也交回给了调用者。下面的代码将打印斐波拉契数据: IEnumerable&lt

喵叔 1万+

YOLO26涨点改进 |独家创新,小目标涨点改进篇 | Arxiv 2025 | MHAF‑YOLO,引入RepHMS高效特征提取模块,适合轻量级目标检测、小目标检测、图像分类、旋转目标检测、实例分割

本文提出了一种改进的YOLO26目标检测模型,通过引入RepHMS模块和多分支辅助特征金字塔结构(MAFPN),显著提升了模型性能。RepHMS模块采用多分支异构卷积和重参数化策略,在不增加推理开销的情况下增强多尺度特征提取能力,尤其提升了小目标检测效果。实验表明,改进后的MHAF-YOLO模型在COCO数据集上仅用7.1M参数就达到48.9% AP,相比YOLO11-s参数量减少24.4%而性能提升1.9%。文章详细介绍了RepHMS模块的原理、实现代码及在YOLO26中的集成方法,并提供了两种改进配置。

Ai缝合怪、助力小伙伴高效发论文 198

【C#基础 记录1】yieId return和return的区别

写点东西: 来上海四年工作多了,从学校里面的MFC、VxWorks、WindML,到工作用的Qt、C++、DuiLib、Windows生物识别驱动、有点含量的HCK和HLK测试,再到嵌入式开发板、乐鑫的esp8266、 Wifi联网锁的开发、物联网平台,小程序开发等等,感觉学了不少,又感觉啥都没有学到,出于职业规划考虑决定需要在一方面或者某个行业精益求精,而不能考虑广度优先的原则了,于是跳了槽来了国内最大的的某医疗公司开始了医疗软件开发相关工作。后面都后记录自己学习的点滴,勉励自己变得更加优...

人生起猿 558

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C#中yield return用法

1.yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历不使用yield return的实现static IEnumerable<int> FilterWithoutYield(){ List<int> result = new List<int>(); f...

weixin_30477797的博客 91

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

yield 用法分析

yield关键字向编译器指示它所在的方法是迭代器块。编译器生成一个类来实现迭代器块中表示的行为。在迭代器块中,yield关键字与return关键字结合使用,向枚举器对象提供值。这是一个返回值,例如,在foreach语句的每一次循环中返回的值。yield关键字也可与break结合使用,表示迭代结束。 例子:yield return <expression>;yield...

weixin_34128237的博客 160

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

深入理解 C#.NET IEnumerable<T>:一切集合的起点

IEnumerable<T> 是 .NET 中表示可枚举集合的核心接口,支持迭代操作。它通过 GetEnumerator() 方法返回 IEnumerator<T> 实现遍历功能,是 foreach 循环的基础。该接口支持延迟执行(Lazy Evaluation),是 LINQ 查询的基础机制。与 IQueryable<T> 不同,IEnumerable<T> 在本地内存中执行,适用于内存集合操作。通过 yield return 可简化迭代器实现,自动生成状态

tangPHP的博客 514

C# ~ 从 IEnumerable / IEnumerator 到 IEnumerable<T> / IEnumerator<T> 到 yield

IEnumerable / IEnumerator 首先,IEnumerable / IEnumerator 接口定义如下:public interface IEnumerable /// 可枚举接口 { IEnumerator GetEnumerator(); } public interface IEnumerator /// 枚举器接口 { object Current

万箭穿心,习惯就好。 2719

C#中,什么时候用yield return

yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历。 有这样的一个int类型的集合: static List<int> GetInitialData() { return new List<int>(){1,2,3,4}; ...

weixin_30510153的博客 165

C#中yield return用法分析

本文实例讲述了C#中yield return用法,并且对比了使用yield return与不使用yield return的情况,以便读者更好的进行理解。具体如下: yield关键字用于遍历循环中,yield return用于返回IEnumerable,yield break用于终止循环遍历。 有这样的一个int类型的集合: static List GetInitialData()

cbbbc 3396

C#基础:yield return关键字的特点

1.最终返回的结果是IEnumerable<T>2.使用yield return时,返回的是单个元素(即T)3.好处:延迟加载,需要时才计算。

m0_67412019的博客 518

了解 C# foreach 内部语句和使用 yield 实现的自定义迭代器

在本期专栏中,我将介绍我们在编程时经常用到的 C# 核心构造(即 foreach 语句)的内部工作原理。了解 foreach 内部行为后,便可以探索如何使用 yield 语句实现 foreach 集合接口,我将对此进行介绍。 虽然 foreach 语句编码起来很容易,但很少有开发者了解它的内部工作原理,这让我感到非常惊讶。例如,你是否注意到 foreach 对数组的运行方式不同于 IEnum

dotNET跨平台 986

记一次被yield return坑的历程。

事情的经过是这样的: 我用C#写了一个很简单的一个通过迭代生成序列的函数。 public static IEnumerable Iterate(this Func f, T initVal, int length) { Checker.NullCheck(nameof(f), f); Checker.RangeCheck(nameof(length), len

daye5465的博客 1113

关于yield return的使用

文实例讲述了C#中yield return用法,并且对比了使用yield return与不使用yield return的情况,以便读者更好的进行理解。具体如下: yield关键字用于遍历循环中,yield return用于返回IEnumerable,yield break用于终止循环遍历。 有这样的一个int类型的集合: [cpp] view plain 

yangyongUestc的博客 1060
上一篇: 多个 DIV 自动 排序(基于Jquery)
下一篇: ASP.NET页面错误处理
make1828
博客等级 码龄19年 60粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值