没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|使用教程|编辑:王香|2018-10-10 09:49:43.000|阅读 301 次
概述:本文主要讲解foreach循环的工作方式。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
相关链接:
【下载FastReport.Net最新版本】
我们都知道foreach循环是 - 循环遍历集合的所有元素。它在易用性方面的最大优势 - 我们不需要担心集合中有多少元素。然而,许多人不知道这只是语法“sugar”,这有利于程序员的工作。因此,我们只需知道生成的编译器将转换的内容。foreach循环的工作方式不同,具体取决于您要排序的集合。
(1)如果必须处理平凡阵列,我们总能知道它的长度。因此,foreach最终将转换为for循环。例如:
int[] array = new int[]{1, 2, 3, 4, 5, 6}; foreach (int item in array) { Console.WriteLine(item); }
编译器将循环转换为此构造:
int[] temp; int[] array = new int[]{1, 2, 3, 4, 5, 6}; temp = array; for (int i = 0; i < temp.Length; i++) { int item = temp[i]; Console.WriteLine(item); }
(2)但是,许多集合不支持对元素的索引访问,例如:Dictionary,Queue,Stack。在这种情况下,将使用迭代器模板。此模板基于接口System.Collections.Generic.IEnumerator 和非通用System.Collections.IEnumerator,它允许您迭代集合中的元素。IEnumerator包含:
IEnumirator 继承自两个接口 - IEnumirator和IDisposable。它包含Current属性的重载,按类型提供其实现。既然我们提到了接口IDisposable,那么我们就会说几句话。它包含释放资源所需的唯一Dispose()方法。每次循环终止或退出时,IEnumirator 都会清除资源。我们来看看这个循环:
System.Collections.Generic.Queue<int> queue = new System.Collections.Generic.Queue<int>(); queue.Enqueue(1); queue.Enqueue(2); queue.Enqueue(3); foreach (int item in queue) { Console.WriteLine(item); }
编译器将其转换为类似的代码:
System.Collections.Generic.Queue<int> queue = new System.Collections.Generic.Queue<int>(); queue.Enqueue(1); queue.Enqueue(2); queue.Enqueue(3); int num; while (queue.MoveNext()) { num = queue.Current; Console.WriteLine(num); }
在此示例中,MoveNext替换了在循环期间计算元素的需要。当它没有收到下一个元素时,它返回fasle并且循环终止。 但是,尽管如此,这段代码只是近似于编译器的真正产生。问题是,如果您有两个或更多重叠循环使用相同的集合,则每个MoveNext调用将影响所有循环。这个过程不适合任何人。想出了第二个接口IEnumirator。
它包含唯一的方法GetEnumerator(),它返回一个枚举器。因此,IEnumerable 及其IEnumerable的通用版本允许您呈现枚举集合类中的元素的逻辑。通常,这是一个嵌套类,可以访问集合的元素并支持IEnumerator 。拥有每个枚举器,不同的消费者不会相互干扰,同时执行集合的枚举。 因此,上面的例子应该考虑两点 - 获得一个枚举器和释放资源。以下是编译器实际转换foreach循环代码的方法:
System.Collections.Generic.Queue<int> queue = new System.Collections.Generic.Queue<int>(); System.Collections.Generic.Queue<int>.Enumerator enumirator; IDisposable disposable; enumirator = queue.GetEnumerator(); queue.Enqueue(1); queue.Enqueue(2); queue.Enqueue(3); try { int num; while (enumirator.MoveNext()) { num = enumirator.Current; Console.WriteLine(num); } } finally { disposable = (IDisposable)enumirator; disposable.Dispose(); }
您可能认为对于集合的迭代,您需要实现IEnumerable和IEnumerable 接口。但是,这并不完全正确。要编译foreach,只需要实现GetEnumerator()方法,该方法将返回另一个具有Current属性和MoveNext()方法的对象。 这里我们使用duck typing - 一种众所周知的方法。
也就是说,如果有一个GetEnumerator()方法的对象,它返回一个带有MoveNext()方法和Current属性的对象,那么这就是枚举器。 否则,如果找不到必要的对象,并且找不到必要的方法,则将搜索IEnumerable和IEnumerable 接口。 因此,foreach实际上是一个通用循环,可以同时适用于数组和集合。我经常使用它。但是,foreach有一个缺点 - 它只允许读取元素,并且不允许更改它们。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
PDF文件因其高度的跨平台兼容性和安全稳定的格式特点,广泛应用于企业文档管理和电子资料传输中。本文将详细讲解如何使用 Spire.PDF for .NET 库在C# 中实现多种PDF拆分功能,包含按每页拆分、按页码范围拆分、按关键字拆分及提取指定页面等场景的完整示例代码,帮助开发者轻松掌握高效的PDF分割技巧,优化文档管理流程。
本文主要介绍如何使用DevExpress WPF Grid控件获取节点,欢迎下载最新版组件体验!
通过将绘图转换为 Photoshop 格式,您可以轻松编辑和增强设计。Aspose.CAD是一款功能强大的 SDK,可无缝实现此转换。借助Aspose.CAD for Python via .NET,开发人员可以自动化转换过程,从而节省时间并减少错误。本博客将指导您如何使用 Python 将绘图转换为 Photoshop。
本教程主要为大家介绍DevExpress WinForms Tile(平铺)视图的基础知识,欢迎下载最新版组件体验!
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号