C#中关于foreach遍历使用的深入理解

在c#中通过foreach遍历一个列表是经常拿用的方法,使用起来也方便,下面这篇文章先给大家介绍了关于c#中foreach遍历的使用方法,后面介绍了c#使用foreach注意的一些是,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。

前言

本文主要给大家介绍了关于C#中foreach遍历的用法以及c#使用foreach需要知道的一些事,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:

一、C#中foreach遍历用法

foreach循环用于列举出集合中所有的元素,foreach语句中的表达式由关键字in隔开的两个项组成。in右边的项是集合名,in左边的项是变量名,用来存放该集合中的每个元素。

该循环的运行过程如下:每一次循环时,从集合中取出一个新的元素值。放到只读变量中去,如果括号中的整个表达式返回值为true,foreach块中的语句就能够执行。一旦集合中的元素都已经被访问到,整个表达式的值为false,控制流程就转入到foreach块后面
的执行语句。

foreach语句经常与数组一起使用,下面实例将通过foreach语句读取数组的值并进行显示。

数组的属性:Array.Length数组的容量

利用这个属性,我们可以取得数组对象允许存储的容量值,也就是数组的长度、元素个数,这个比较好理解,数组还有其他的属性,比如数组的维数等,属性的用法比较简单,学会一种,其他的格式基本一致,这里我们就不举例了。

当数组的维数、容量较多时,C#提供了foreach语句,专门用来读取集合/数组中的所有元素,我们把这种功能叫做遍历。语法书写如下:

遍历数组:foreach(type objName in collection/Array)

这段语句会逐一检查数组中的所存储的变量值,并且一一将其取出,其中的type是你所要读取的数组对象将要存储在objName变量的数据类型,而objName是定义了一个type类型的变量名,代表每一次从集合和数组(collection/Array)中取得的元素,collection/Array则是所要存取的数组对象。用这种方法只需写一个foreach就可以遍历出除交错数组以外的所有维数的数组。

注: objName的数据类型type必须与collection/Array对象的类型相同或比它大。

下面我们举一个用foreach和for遍历规则数组的例子,其中涉及到了一个数组得到维数的方法,比较foreach在一次性遍历规则数组上的优势。

int[,,] a = new int[2, 2, 2] { {{ 1, 2 }, { 3,4}},{{ 5, 6 }, { 7,8}} };// 定义一个2行2列2纵深的3维数组afor (int i = 0; i 

用foreach循环一次性遍历a数组


int[,,] a = new int[2, 2, 2] { {{ 1, 2 }, { 3,4}},{{ 5, 6 }, { 7,8}} };//定义一个2行2列2纵深的3维数组aforeach(int i in a){ Console .WriteLine (i);}

登录后复制

这两种代码执行的结果是一样的都是 每行一个元素,共8行,元素分别是1 2 3 4 5 6 7 8

下面我们再做个例子,是一个利用for和foreach循环做的存取数组元素的例子,首先提示用户输入学生的个数,然后把学生个数作为存储学生姓名的数组names的元素个数,采用for循环按照数组的索引i从0位开始循环输出"输入学生姓名"的提示,并把用户输入的学生姓名按照其在数组的索引方式names[i]存储在names数组中,for循环次数的最大值(即索引的最大值)通过数组属性.Length得到,我们说过容量与索引之间的关系是index=Array.Length-1,本题即i的最大值

必须注意的是:借助foreach,只能一一取得数组中的元素,并不能利用这种语句改变数组所存储的元素。

C#中关于foreach遍历使用的深入理解

using System;class Program{ static void Main() { int count; Console.WriteLine("输入要登记的学生数"); count = int.Parse(Console.ReadLine()); string[]names = new string[count]; for (int i = 0; i 

二、c#使用foreach需要知道的

在c#中通过foreach遍历一个列表是经常拿用的方法,使用起来也方便,性能上也和for没有多大的差别;那为什么还要注意呢?我们先下来看下以下这句话:分配的内存数量和完成测试所需的时间之间有直接关系。当我们单独查看的时候,内存分配并不是非常昂贵。但是,当内存系统只是偶尔清理不使用的内存时,问题就出现了,并且问题出现的频率和要分配的内存数量成正比。因此,你分配越多的内存,对内存进行垃圾回收的频率就越频繁,你的代码性能就会变得越差。

从上面那些话可以看到内存的回收是非常损耗资源,那我们再看下一些.net内部类型的实现。

Array:


// System.Arraypublic IEnumerator GetEnumerator(){int lowerBound = this.GetLowerBound(0);if (this.Rank == 1 && lowerBound == 0){return new Array.SZArrayEnumerator(this);}return new Array.ArrayEnumerator(this, lowerBound, this.Length);}

登录后复制

List:

// System.Collections.Generic.Listpublic List.Enumerator GetEnumerator(){return new List.Enumerator(this);}

登录后复制

Dictionary:

// System.Collections.Generic.Dictionarypublic Dictionary.Enumerator GetEnumerator(){return new Dictionary.Enumerator(this, 2);}

登录后复制

从以上代码来看,我们再进行foreach操作以上对象的时候都会构建一个Enumerator;也许有人会认为这点东西不需要计较,不过的确很多情况是不用关心;但如果通过内存分析到到的结果表明构建Enumerator的数量排在前几位,那就真的要关心一下了。很简单的一个应用假设你的应用要处理几W的并发,而每次都存在几次foreach那你就能计算出有多少对象的产生和回收?

看下一个简单的分析图,这里紧紧是存在一个List'1如果组件内部每个并发多几个foreach又会怎样?

C#中关于foreach遍历使用的深入理解

改成for的结果又怎样呢

C#中关于foreach遍历使用的深入理解

总结

以上就是C#中关于foreach遍历使用的深入理解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2438816.html

(0)
上一篇 2025年3月3日 11:51:04
下一篇 2025年3月2日 04:50:36

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 从零讲解.Net Core开发实现图片文件上传下载

    这篇文章主要为大家详细介绍了.net core实现图片文件上传下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 当下.Net Core项目可是如雨后春笋一般发展起来,作为.Net大军中的一员,我热忱地拥抱了.Net Core并且积…

    2025年3月3日 编程技术
    200
  • 有关.Net MVC长轮询的实现方法

    这篇文章主要为大家详细介绍了.net mvc实现长轮询的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 什么是长轮询?     长轮询是“服务器推”技术实现方式的一种,可以将服务端发生的变化实时传送到客户端而无须客户端频繁的地刷…

    编程技术 2025年3月3日
    200
  • C#中序列化的使用总结

    贴一下自己序列化的代码: public class XMLUtil    {        ///         /// XML & Datacontract Serialize & Deserialize Helper …

    编程技术 2025年3月3日
    200
  • C#如何计算传入的时间距离今天的时间差的实例分享

    c#如何计算传入的时间距离今天的时间差的实例分享 ///        /// 计算传入的时间距离今天的时间差       ///        ///        ///        ///        ///        pub…

    编程技术 2025年3月3日
    200
  • 比较.NET中接口与类

    在我们日常开发中经常会用到接口与类,这两者之间究竟有什么区别呢?又有哪些优缺点?下面这篇文章就来给大家介绍了关于.net中接口与类区别的相关资料,需要的朋友们可以参考借鉴,下面来一起看看吧。 前言 大家应该都知道,在.Net中提供了接口,这…

    编程技术 2025年3月3日
    200
  • C#中关于AutoMapper应用的实例

    最近发现了一个比较有趣的东西 automapper,主要将model转换为dto,dto更注重数据,对领域对象进行合理封装,从而不会将领域对象的行为过分暴露给表现层。 先来看一点实例,两个类之前的映射。 首先定义两个类Source与DTOS…

    2025年3月3日
    200
  • 支付宝的支付接口在.net中的使用

    这篇文章主要为大家详细介绍了.net接入支付宝的支付接口,h5网站接入支付宝的支付接口,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 H5手机网站接入支付宝的支付接口,推荐使用支付宝提供的SDK来快速开发 我使用的是SDK开发 引用命名…

    编程技术 2025年3月3日
    200
  • 代码分析:在.Net Core中使用ref和Span<T>提高程序性能

    这篇文章主要介绍了.net core中使用ref和span提高程序性能的简单实现代码,需要的朋友可以参考下 一、前言 其实说到ref,很多同学对它已经有所了解,ref是C# 7.0的一个语言特性,它为开发人员提供了返回本地变量引用和值引用的…

    编程技术 2025年3月3日
    200
  • 总结.NET如何获取当前路径的方法

    本文汇总了.net(包括asp.net/winform等)获取当前路径的各种方法,具有一定的参考价值,下面跟着小编一起来看下吧 以下汇总了.NET(包括ASP.NET/WinForm等)获取当前路径的各种方法 //获取当前进程的完整路径,包…

    编程技术 2025年3月3日
    200
  • 分析.NET的异常处理

    这篇文章主要介绍了关于.net异常处理的思考总结,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。 年关将至,对于大部分程序员来说,马上就可以闲下来一段时间了,然而在这个闲暇的时间里,唯有争论哪门语言更好可以消磨时光,估计最近会有很多关于…

    编程技术 2025年3月3日
    200

发表回复

登录后才能评论