IEnumerable 接口---实现该接口里的成员的类,可以使用foreach循环访问集合

SigFit实战:从FEA到光学仿真的热力耦合分析全流程解析 在光机系统与芯片封装等精密工程领域,热与力的耦合效应是影响产品性能与可靠性的核心物理问题。有限元分析(FEA)是预测结构在热、力载荷下变形与应力的基础工具,但其结果通常无法直接用于评估光学性能。这需要一座桥梁,将物理场数据转化为光学设计语言。其核心原理在于数据映射与面形表征技术,例如通过泽尼克多项式拟合,将离散的节点位移分解为离焦、像散等标准光学像差。这项技术的工程价值在于,它实现了多物理场仿真的闭环,使工程师能在设计阶段精准预测热变形或应力对波前误差、调制传递函数等关键光学指标的影响。其典型应用场景包括高 阅读详情

IEnumerable 接口支持对非泛型集合的简单迭代。 实现该接口里的成员的类,可以使用foreach循环访问集合(VB为For Each)。

       备注

IEnumerator 是所有非泛型枚举数的基接口。

有关此接口的泛形版本,请参见 IEnumerator<(Of <(T>)>)。

C# 语言的 foreach 语句(在 Visual Basic 中为 for each)隐藏了枚举数的复杂性。因此,建议使用 foreach,而不直接操作枚举数。

枚举数可用于读取集合中的数据,但不能用于修改基础集合。

最初,枚举数定位在集合中第一个元素前。Reset 方法还会将枚举数返回到此位置。在此位置,调用 Current 属性会引发异常。因此,在读取 Current 的值之前,必须调用 MoveNext 方法将枚举数提前到集合的第一个元素。

在调用 MoveNext 或 Reset 之前,Current 返回同一对象。MoveNext 将 Current 设置为下一个元素。

如果 MoveNext 越过集合的末尾,则枚举数将被放置在此集合中最后一个元素的后面,而且 MoveNext 返回 false。当枚举数位于此位置时,对 MoveNext 的后续调用也返回 false。如果最后一次调用 MoveNext 返回 false,则调用 Current 会引发异常。若要再次将 Current 设置为集合的第一个元素,可以调用 Reset,然后再调用 MoveNext。

只要集合保持不变,枚举数就保持有效。如果对集合进行了更改(如添加、修改或删除元素),则枚举数将失效且不可恢复,并且下一次对 MoveNext 或 Reset 的调用将引发 InvalidOperationException。如果在 MoveNext 和 Current 之间修改集合,那么即使枚举数已经无效,Current 也将返回它所设置成的元素。

枚举数没有对集合的独占访问权;因此,枚举通过集合在本质上不是一个线程安全的过程。即使一个集合已进行同步,其他线程仍可以修改该集合,这将导致枚举数引发异常。若要在枚举过程中保证线程安全,可以在整个枚举过程中锁定集合,或者捕捉由于其他线程进行的更改而引发的异常。

 

示例

       下面的代码示例演示如何实现自定义集合的 IEnumerable 和 IEnumerator 接口。在此示例中,没有显式调用这些接口的成员,但实现了它们,以便支持使用 foreach(在 Visual Basic 中为 For Each)循环访问该集合。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

//

using System.Collections;

 

namespace MvcUsedKeywords

{

    public class Person

    {

        public string firstName;

        public string lastName;

        public Person(string fName, string lName)

        {

            this.firstName = fName;

            this.lastName = lName;

        }

    }

 

    //实现IEnumerable接口中的方法

    public class People : IEnumerable

    {

        private Person[] _people;

        public People(Person[] pArray)

        {

            _people=new Person[pArray.Length];

            for (int i = 0; i < pArray.Length; i++)

                            {

                _people[i]=pArray[i];

                            }

        }

 

        public IEnumerator GetEnumerator()

        {

            return new PeopleEnum(_people);

        }

    }

 

    //实现IEnumerator接口中的方法

    public class PeopleEnum : IEnumerator

    {

        public Person[] _people;

        int position = -1;

 

        public PeopleEnum(Person[] list)

        {

            _people = list;

        }

 

        public bool MoveNext()

        {

            position++;

            return (position < _people.Length);

        }

 

        public void Reset()

        {

            position = -1;

        }

 

        public object Current

        {

            get

            {

                try

                {

                    return _people[position];

                }

                catch (IndexOutOfRangeException)

                {

                    throw new InvalidOperationException();

                }

            }

        }

    }

 

    class App

    {

        static void Main(string[] args)

        {

            Person[] peopleArray = new Person[3]{

                new Person("John","Smith"),

                new Person("Jim","Johnson"),

                new Person("Sue","Rabon"),

            };

 

            //利用实现IEnumerable接口中方法的类,利用foreach遍历集合

            Console.WriteLine("利用实现IEnumerable接口中方法的类:");

            People peopleList = new People(peopleArray);

            foreach (Person p in peopleList)

                Console.WriteLine(p.firstName + " " + p.lastName);

 

            PeopleEnum peopleEnum = new PeopleEnum(peopleArray);

 

            //利用实现IEnumerator接口中方法的类,利用实现的方法来遍历集合

            Console.WriteLine("/n利用实现IEnumerator接口中方法的类:");

            Person person=null;

            while (peopleEnum.MoveNext())

            {

                person = (Person)peopleEnum.Current;

                Console.WriteLine(person.firstName + " " + person.lastName);

            }

           

        }

    }

}

运行结果
利用实现IEnumerable接口中方法的类:
John Smith
Jim Johnson
Sue Rabon

利用实现IEnumerator接口中方法的类:
John Smith
Jim Johnson
Sue Rabon
请按任意键继续. . .

PS2硬盘启动终极指南:从FMCB到OPL,告别光驱打造游戏博物馆 在计算机存储与数据读取领域,硬盘启动技术通过将操作系统或应用程序从本地硬盘直接加载,绕过了传统光驱等外部介质,实现了速度与可靠性的双重提升。其核心原理在于利用引导程序接管系统初始化流程,直接访问硬盘上的特定分区与文件镜像。这项技术的价值在于极大提升了数据读取效率、降低了物理介质损耗,并扩展了存储容量与管理的灵活性。在怀旧游戏硬件改造、嵌入式系统定制等场景中,硬盘启动技术被广泛应用,以实现老旧设备的功能焕新与性能优化。本文聚焦于索尼PS2游戏主机的硬盘启动方案,深入探讨了如何利用FMCB(Free MCBoo 阅读详情

相关推荐

Vite与Webpack路径配置大不同:从Vue2迁移到Vue3必须知道的public目录使用技巧

本文详细解析了Vite与Webpack在public目录路径配置上的核心差异,为Vue2迁移到Vue3的开发者提供实用指南。重点对比了两种构建工具的资源处理逻辑,给出典型编译警告的解决方案,并分享路径适配表与高级优化技巧,帮助开发者高效完成技术栈升级。

weixin_30836759的博客 485

c html循环ienumerable,总结IEnumerable用法介绍

本文主要介绍了C#中IEnumerable和IEnumerator接口的相关知识,具有很好的参考价值,下面跟着小编一起来看下吧温故而知新,可以为师矣,有空经常复习一下基础知识是有必要的,并且能加深理解和记忆。Foreach常用于循环访问集合,对实现IEnumerable的接口的容器进行遍历,IEnumerable和IEnumerator接口我有时候也有点迷糊,按官方的解释,IEnumerable是...

weixin_39851872的博客 396

【LVGL】从HTML到LVGL:嵌入式UI的设计迁移与落地实践

嵌入式UI迁移实践:从HTML到LVGL 本文介绍了将HTML/CSS设计的UI原型迁移到嵌入式系统(LVGL)的完整流程,重点涉及"HTML→Figma→LVGL"的三步转换方法。具体内容包括: 设计迁移流程:通过Figma作为中间桥梁,将HTML原型转化为标准设计资产,再适配到LVGL库; 工具与参数准备:详细列出了设计迁移所需的工具链和需要提取的核心设计参数; Figma还原步骤:分组件讲解如何在Figma中1:1还原HTML设计,包括标题栏、压力显示区、图表区等核心组件; LVG

ymlmail的博客 1971

Enumerable.All<(Of <(TSource>)>) 方法

Enumerable.All<(Of <(TSource>)>) 方法 确定序列中的所有元素是否满足条件。 语法 public static bool<TSource>( this IEnumerable<TSource> source, Func<TSource, bool> predicate ) 类...

weixin_30300523的博客 455

PX4二次开发实战:从零构建自定义飞控模块

本文详细介绍了PX4二次开发的实战指南,从环境搭建到自定义飞控模块的创建,涵盖了uORB消息定义、外部传感器驱动集成、控制算法实现等关键步骤。通过具体代码示例和调试技巧,帮助开发者快速入门PX4二次开发,构建高效稳定的无人机飞控系统。

weixin_29175469的博客 339

TwinCAT 3 实战指南:从系统配置到高级运动控制

本文详细介绍了TwinCAT 3工业自动化控制平台的实战应用,从系统配置、PLC编程到EtherCAT总线配置和高级运动控制。通过倍福(Beckhoff)的TwinCAT 3平台,工程师可以高效实现复杂的工业自动化任务,包括运动控制、PLC编程等。文章还提供了常见问题排查和性能优化技巧,帮助用户提升系统稳定性和实时性。

weixin_30831529的博客 304

IEnumerable公开枚举器

// 摘要: // 公开枚举器,该枚举器支持在非泛型集合上进行简单迭代。 [ComVisible(true)] [Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")] public interface IEnumerable { // 摘要: // 返回一个循环...

weixin_34297300的博客 225

【数据结构】考点二十八 : 二叉树的概念:二叉树的度、完全二叉树、满二叉数结点数、哈夫曼结点数、完全二叉树的深度

二叉树(Binary Tree)是一种常见的数据结构,它或者为空(null),或者由一个根节点(root node)和两个子树(left subtree 和 right subtree)组成,这两个子树又分别是一棵二叉树。二叉树的每个节点最多有两个子节点,通常称为左子节点(left child)和右子节点(right child)。

超越的博客 1737

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

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

zls365365的博客 3253

22、硬件工程师笔试面试——电机(2025版本)

例如,B级绝缘的电机可以承受的最高温度为130℃,而H级绝缘的电机可以承受高达180℃的温度。同时,也要考虑电机的成本和控制系统的复杂性。电机的选择取决于其应用的具体要求,包括所需的功率、速度、扭矩、效率、成本和工作环境等。根据电动机保护配置原则,为电机配置适当的保护,如过负荷保护、缺相保护、逆相保护、接地漏电保护、堵转保护、相不平衡保护、短路保护、过电压保护、低电压保护、过热保护等。根据安培环路定理,电流和磁场的相互作用会在电机的转子上产生力,这些力作用于转子上,使其绕轴旋转,从而产生转矩。

XU157303764的博客 3538

〔重庆理工大学〕操作系统实验指导书【实验三 系统调用】

本实验指导书详细介绍了在Linux 0.11系统中添加两个自定义系统调用(iam()和whoami())的完整流程。实验内容包括:修改unistd.h添加系统调用号,更新sys_call_table数组,实现内核函数sys_iam()和sys_whoami(),以及编写测试程序验证功能。关键步骤涉及用户态与内核态数据传递、系统调用号分配、中断处理机制等核心概念。实验要求学习者通过修改内核源码、理解系统调用原理,最终实现名字存储与读取功能,并完成测试验证。实验还提供了视频学习资源和参考书籍,帮助深入理解操作系

Pretty Boy Fox的博客 1294

IEnumerable 和 IEnumerator 接口

 实现 IEnumerable 接口的类,可以支持 foreach循环遍历对象的集合元素 IEnumerable:接口的成员IEnumerator  GetEnumerator()    返回可循环访问集合的枚举数 IEnumerator :接口的成员object Current 获取集合中的当前元素bool   MoveNext()  将枚举数推进到机顶盒的下一个元素

xhh_net的专栏 394

【Mode】多模干涉仪的设计 Multi-mode interferometer(MMI)

与 Splitter 器件一样,MMI 器件也是一种常见的分光器件,可以根据用户的需求将光束分成不同的比例。本文,我们将介绍如何仿真 MMI 器件。这里我们使用的是 1x2 MMI,其本质上是由四个部分组成的,中间的矩形多模式干涉区域以及左右两侧的三个 taper 模式转换区域。之前的教程中我们也提及了,为了获取稳定的模式场分布,通常,我们需要进行模式收敛性扫描。这里以官网给出的案例为例。如何提取 S 参数我们先暂时不做介绍,后续有时间了我们再做介绍。

u011699626的博客 1212

利用 IEnumerable接口 实现自定义类型的集合的foreach遍历

IEnumerable 接口公开枚举数,该枚举数支持在非泛型集合上进行简单迭代。方法:    GetEnumerator  返回一个循环访问集合的枚举数。    GetEnumerator  C#语法:            IEnumerator GetEnumerator() 示例:下面的代码示例演示如何实现自定义集合的 IEnumerable 和 IEnumerator 接口。在此示例中,没有显式调用这些接口的成员,但实现了它们,以便支持使用 foreach(在 Visual Basic 中为 For

小强的天空 2308

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

unity的C#学习——foreach循环相关:IEnumerable接口、LINQ语言集成查询、可枚举对象与枚举类型

foreach循环是c#不同于c语言的一种循环方式,但如果你学过python应该对这种循环遍历不陌生。这种通过in语句和可枚举对象实现的循环,内部还涉及到IEnumber接口和LINQ语言集成查询的知识,这里将做出简单介绍。同时为了避免混淆枚举类型和可枚举对象,在本文中也将一并解释两者之间的差异。

时生的博客 2558

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C# IEnumerable接口

C# 中如果需要使用关键字foreach去迭代(轮询)一遍一个集合的内容,那么就需要这个类实现IEnumerable接口。 C# 很多官方提供的Collection集合已经实现了IEnumerable接口的,比如ArrayList,Queue,Stack等类都实现了IEnumerable接口,我们可以放心使用foreach。(ArrayList是通过IList接口间接包含了IEnumerable...

皮皮君的博客 5116

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C#接口学习之IEnumerable接口及其泛型版本(一)

在日常开发中,常使用集合来储存各种类型的数据。细心的同学可能会发现,那些我们常用的集合几乎都实现了IEnumerable接口。问题是对于很多新手来说不了解这个IEnumerable接口到底是用来做什么的?

CodeRookieGuo的博客 1万+

用foreach遍历访问的对象不一定需要实现IEnumerable接口,但是一定要实现GetEnumerator方法

用foreach遍历访问的对象需要不一定需要实现IEnumerable接口,但是一定要实现GetEnumerator方法

qq_46126258的博客 1165

如何自己实现IEnumerable和IEnumerator接口以支持foreach语句

在C#中,凡是实现了IEnumerator接口的数据类型都可以用foreach语句进行迭代访问,可是,对于自定义类型如何实现这个接口以支持foreach的迭代呢?要实现这个功能,先来看看IEnumerable和IEnumerator接口的定义:public interface IEnumerable{      //IEnumerable只有一个方法,返回可循环访问集合的枚举数。     

C#入门之路 4380

C# 中 foreach 循环和 for 循环深度比较

为什么建议你多数情况下使用 foreach 进行遍历循环?看完你就明白了

yangshuquan的专栏 1402

C# 自己实现IEnumerable接口来实现foreach遍历

实现了IEnumerable接口的集合才可以使用foreach 如何进行foreach是通过IENumerable下的GetEnumerable方法来实现的。 这个方法需要一个IEnumerator对象 这个对象的这些方法就决定了怎么样去遍历你定义的集合 如下图是自己定义的LinkedList需要自己去实现下面这个方法。 I IEnumerator IEnumerable...

h1311454244的博客 2374

IEnumerable和IEnumerator 详解

初学C#的时候,老是被IEnumerable、IEnumerator、ICollection等这样的接口弄的糊里糊涂,我觉得有必要切底的弄清楚IEnumerable和IEnumerator的本质。 下面我们先看IEnumerable和IEnumerator两个接口的语法定义。其实IEnumerable接口是非常的简单,只包含一个抽象的方法GetEnumerator(),它返回一个可用于循环访问集

中辽普坦的专栏 17万+

C# IEnumerable Foreach 深入理解

阅前提示 本章内容主要针对 C# 中的IEnumerable及其相关内容做详细的解释。 你真的了解Foreach的本质是什么吗?你对yield关键有多少了解呢?希望这篇文章可以让你更清楚的认识你常常会使用的IEnumerable。 适合人群:对C#一定使用基础 阅读方式:浏览 正文 Foreach 这是我们除了for 循环之外可能用到最多的循环语句,它写起来比for循环要舒服而且更易于去理解。 但...

vin129的博客 2776

c#中foreach与接口IEnumerator和IEnumerable

用foreach可以遍历集合中所有元素,实现:c#编译器会把foreach语句转换为IEnumerable接口中的方法和属性,例如 foreach(var val in intseq) { Console.WriteLine(val); } c#编译器把上述代码转换为: IEnumerator enumerator =intseq.GetEnumerator; while(enu

mashen1989的专栏 3092

IEnumerable和IEnumerator详解(IEnumerable的使用方法详解)

在使用在使用Foreach遍历的时候它其实是转换为While,MoveNext()的形式的,所以你这个遍历对象必须是一个可枚举的类型,具有MoveNext()方法。   实现IEnumerable主要用来进行foreach遍历的,在Linq中经常会用到,IEnumerator是真正的集合访问器,  初学C#的时候,老是被IEnumerable、IEnumerator、ICollect

u010501161的专栏 9097

详解 C# 中 IEnumerable 和 IEnumerator 接口的使用

通过实现和接口,我们可以自定义集合类的遍历逻辑,使类支持foreach循环和 LINQ 查询。这不仅提高了代码的灵活性和可复用性,也为处理复杂数据结构提供了更多可能性。无论是构建一个简单的颜色列表,还是处理大型数据集,理解和的机制都是掌握 C# 高级编程的关键一步。

钢铁男儿 2470
上一篇: 匿名方法---将代码块作为参数传递给委托
下一篇: .NET中yield关键字的用法
aspnet2002web
博客等级 码龄21年 482粉丝 310原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值