首页 > 编程语言 >c#数组

c#数组

时间:2023-04-21 10:45:59浏览次数:39  
标签:变量 索引 c# 元素 C# 循环 数组

原文地址 zhuanlan.zhihu.com

c#数组

残枫cps残枫cps

​目录收起C#的声明数组和赋值C#访问数组元素算法——查找(一)算法——查找(二)C#的foreach关键字C#的二维数组的声明和访问

C#的声明数组和赋值

编程中有这样一种情形:我们需要存储多个同类型数据。比如,保存 1600 个学生的年龄。是否需要声明 1600 个 int 类型的变量?过了一年,学生们长了 1 岁,是否需要给每个变量重新赋值?这件事情,想想就怕怕。好在C#中有一种数组,专门存储一组相同类型的数据。数组的声明和初始化语法如下:

数据类型[ ] 数组名 = new 数据类型[长度];

注意:数组名像变量名一样要遵循标识符的命名规则;长度必须是整数

下面我们来比较变量和数组的声明与初始化,右边是在内存中为变量和数组分配空间的示意:

对比变量 x 和数组 y 就会发现,数组 y 中其实包含了 3 个 double 类型的变量,为什么是 3 个?因为初始化数组时在 [ ] 中声明的长度为 3 。既然都在数组 y 中,所以 3 个变量(应该叫数组元素)的名字都叫 y ,为了区分它们,按照顺序给它们加上索引 [0]、[1]、[2] 。请注意:数组的索引从 0 开始递增。那么,数组 y 中 3 个元素的名字就变成了 y[0]、y[1]、y[2] 。最后再注意一点:数组经过初始化以后,数组元素有默认的初始值double 类型为 0.0 , int 类型为 0 , char 类型为 'a' , bool 类型为 falsestring 类型为 null

数组元素的赋值与普通变量相同。下面的示例中,我们声明了一个长度为 3 的 string 类型数组,逐个赋值,然后打印:

上例中,需要注意的是元素的索引,数组元素索引从 0 开始递增,所以长度为 3 的数组,其元素索引为 [0]、[1]、[2] 。

如何知道一个数组的长度呢? 数组.Length 属性会返回数组的长度(即数组元素的个数)。请看下面的例子:

代码中的 friends.Length 会返回 friends 数组的长度,请看运行结果:

C#访问数组元素

上一节我们学习了数组的声明和初始化,以及数组元素的访问方法。其实,C#中数组元素有多种初始化方式,请看下例:

上例中,数组 a 的初始化方式我们已经学习过了;数组 b、c、d 是在初始化时为数组元素指定初始值,请注意数组 d 用 [3] 声明了数组长度,后面 { } 中的初始值个数要与 [ ] 中声明的长度相同。数组 b、c 初始化没有声明长度,长度由 { } 中的初始值个数确定。

上一节我们还学习了数组的一个属性 Length , Length 能够返回数组的长度,利用它和数组元素的索引,我们可以循环访问每一元素。上一节中打印名字的代码,可以这样改进:

Length 属性返回数组的长度,如上例中,数组长度为 3 , Length 就返回 3 ,即循环变量 i 从 0 循环到 2 。为什么不循环到 3 呢?因为数组元素的索引是从 0 开始的呀!长度为 3 的数组,索引为 0 - 2 。

数组,可以用来存储相同类型的多个数值。声明并初始化数组的语法:

数据类型[] 数组名 = new 数据类型[]{初始值1,初始值2,...初始值3};

数组元素用索引来区分,索引从 0 开始。

数组的 Length 属性返回数组的长度,即数组元素的个数。

算法——查找(一)

请看这段代码和运行结果,你能看出它要做什么吗?

循环变量从 1 循环到了 10 ,但输出的只有 2 4 6 8 10 ,对,这是在打印 1-10 之间的偶数。像这样,循环访问一组数据,从中找出符合条件的数据,这样的算法叫做查找

写查找的算法,需要做 2 件事,一是写循环访问每一个数据,二是对每一个数据进行验证。这样,就需要写 2 个“条件”:循环条件筛选条件

如上例,循环条件是x<=10,筛选条件是x%20。初学者常见的错误是把 2 个条件都写在循环条件里,比如把循环条件写成 x<=10 && x%2 0 ,请注意甄别:循环条件必须能够遍历每一个数据,如果你写的循环条件会漏掉某些数据,或者循环没有能够正常运行,请检查是不是把筛选条件也写在循环条件里了。

算法——查找(二)

上一节我们学习查找,是把符合条件的数据打印出来。有的时候我们不想打印,只想知道有没有符合条件的数据,该怎么做呢?下面的例子查找一组人名,如果人名中包含“诺贝尔”,就打印“有诺贝尔”,如果没有,就打印“木有木有”:

通过源代码可以看到,数组的第二个元素就是要查找的“诺贝尔”,运行结果是这样的:

这段代码有一个逻辑错误,事实上,数组中只要有一个“诺贝尔”就可以认定“有诺贝尔”,但必须所有的名字都不是“诺贝尔”,才能认定“木有木有”。

或者这么说:一组数据中只要有一个符合条件,就可以认为“有符合条件的数据”;但只有一组数据中每一个都不符合条件,才能认为“没有符合条件的数据”——一个相等即为"有",全都不等才是"无"

那么,到底应当怎样判断有无呢?请看下面的代码:

变量 hasNbr 起到了关键作用:记录筛选结果。它的初始值为 false ,表示没有,如果循环中找到了相等的数据,再修改 hasNbr 的值为 true ,表示。循环结束后,只要看看变量 hasNbrtrue 还是 false ,就知道循环中是否修改过。运行结果如下(有诺贝尔):

删去数组中的“诺贝尔”,再次运行程序:

C#的foreach关键字

for 循环使我们可以通过索引访问数组元素;而 foreach 循环则可以不依赖索引而读取每一个数组元素。下面的示例代码声明了一个整型数组,然后通过两种方法打印数组元素:

运行结果是相同的:

使用 foreach 的语法:

需要解释一下 ④ ,如上面的示例代码,迭代变量 x 只能用于读取数组 num 中的值,但是不能给数组元素赋值,如果尝试给 x 赋值,则会有下面的错误提示:

了解了 foreach 循环的语法,你可能会有疑问:好像 foreach 循环能做的 for 都能做, foreach 存在的意义是什么呢?其实,C#中还存在一些类似于数组的数据组织方式,它们中有一些是没有元素索引的,对于这些元素,只能通过 foreach 遍历。

查找算法的另一种应用,是检查一组数据中是否包含符合条件的元素,也就是要给出“有”或“没有”的结论。

要解决这种问题,首先要声明一个“开关变量”,用来记录查找的状态;通常,我们把开关变量初始化为 false ,表示没有找到,循环中如果发现了符合条件的元素,则给变量赋值为 true ,并结束查找。循环结束后,就可以判断开关变量: true 表示“有”, false 表示“没有”。

C#的二维数组的声明和访问

二维数组,就是以数组作为元素的数组。挺拗口的,看看它跟一维数组的对比:

左边的 a 是一维数组,数组中包含 4 个 int 型变量:a[0]、a[1]、a[2]、a[3] 。

右边的 b 是二维数组,数组中包含 2 个 int 型一维数组:b[0]、b[1] 。而 b[0] 和 b[1] 中又分别包含 3 个 int 型变量:b[0,0]、b[0,1]、b[0,2]、b[1,0]、b[1,1]、b[1,2] 。

总结一下,二维数组这样声明:

int[,] arr = new int[2,3]; //包含2个一维数组,每个一维数组包含3个变量,总共2*3=6个数组元素

二维数组元素这样赋值和打印:

arr[1,0] = 28; //二维数组元素有2个索引,都是从0开始,以arr数组为例,元素索引从[0,0]到[1,2]

Console.Write( arr[1,0] );

我们可以用二维数组管理相关的数据,比如有 4 名同学参加语文和数学两门考试,我们用二维数组存储他们的成绩,每位同学的 2 门课分数,存储在一个一维数组中:

运行结果如下:

接收用户输入

F9:添加断点

F10:单步执行

编辑于 2023-04-14 15:14・IP 属地山东开启赞赏赞赏开启后,读者将可以付费支持你的创作。C#C# 编程C# 图像处理​赞同​添加评论​分享​喜欢​收藏​设置

标签:变量,索引,c#,元素,C#,循环,数组
From: https://www.cnblogs.com/cps666/p/17339509.html

相关文章

  • 【DP】LeetCode 312. 戳气球
    题目链接312.戳气球思路参考动态规划套路解决戳气球问题分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums[i]为结尾的状态;dp[i][j]分别表示以nums1[i]和nums......
  • easyExcel导出单个文件多个sheet页-注解方式
    easyExcel注解方式导出,为什么要用注解方式?注解方式更简单、更方便,相比非注解的方式减少了大量代码。但是,注解方式不够灵活,精确度也不高,比如列宽,注解方式仅支持int类型,最大255个字符,而非注解方式就要精确的多,可以随意设置。所以,对于要求比较高的、复杂的Excel,还是推荐使用非注解......
  • c#结构
    原文地址zhuanlan.zhihu.comc#结构残枫cps​目录收起C#用流程图描述程序逻辑C#中判断和分支C#中if...else条件结构C#中嵌套的if结构C#中多重if结构C#中else与if的匹配C#的条件运算符:三元C#的switch结构C#循环流程图和while循环C#算法——求和C#中for循环C#中do…while循环C#......
  • C#写一套最全的MySQL帮助类(包括增删改查)
    介绍说明:这个帮助类包含了六个主要的方法:ExecuteNonQuery、ExecuteScalar、ExecuteQuery、ExecuteQuery(泛型)、Insert、Update和Delete。其中,ExecuteNonQuery用于执行不返回结果集的SQL语句;ExecuteScalar用于执行一个查询,并返回结果集中第一行的第一列;ExecuteQuery用于执行一个查询......
  • ASEMI代理ADM3051CRZ-REEL7原装ADI车规级ADM3051CRZ-REEL7
    编辑:llASEMI代理ADM3051CRZ-REEL7原装ADI车规级ADM3051CRZ-REEL7型号:ADM3051CRZ-REEL7品牌:ADI/亚德诺封装:SOIC-8批号:2023+引脚数量:8安装类型:表面贴装型ADM3051CRZ-REEL7汽车芯片ADM3051CRZ-REEL7特征物理层CAN收发器VCC上的5V操作符合ISO11898标准高达1Mbps的高速数......
  • Oracle 创建定时任务 DBMS_JOB
    需求:创建一个每天凌晨一点执行的任务(存储过程)1、创建存储过程--一般存储过程语法CREATEORREPLACEPROCEDUREUPDATE_LABEL_TABLE_DATE_DTISBEGIN UPDATEIC_CO_BAE_INFOSETDT=TO_CHAR(TRUNC(SYSDATE-1),'yyyy-MM-dd'); UPDATEIC_RG_RRG_INFO_V1SETDT=TO_CHAR(......
  • 浅析流媒体技术的发展趋势及EasyCVR视频技术的应用
    随着科技的不断发展,流媒体已经成为人们日常生活中必不可少的一部分。为了进一步提高流媒体的质量,未来的技术革新方向将集中在以下几个方面:1)提高视频编解码技术的质量和效率随着高清视频的普及,人们对流媒体的质量要求越来越高。未来的技术革新方向将重点关注如何提高视频编解码技......
  • 关于浏览器的Selection对象,以及window.getSelection()的API用法
    Selection 对象就是用户选择的文本范围或插入符号的位置。它代表页面中的文本选区,可能横跨多个元素。文本选区由用户拖拽鼠标经过文字而产生。具有以下属性和方法。 1、anchorNode只读属性,返回选区开始位置所属的节点。用户可能从左往右框选,也可能从右往左框选。但是锚点......
  • Python | isinstance函数的使用
    isinstance是一个Python内置函数,用于检查一个对象是否是指定类或其子类的实例。isinstance(obj,cls)返回一个布尔值,表示obj是否是cls或其子类的实例。类似type()。isinstance()与type()区别:type()不会认为子类是一种父类类型,不考虑继承关系。isinstance()会认......
  • opencv 407 resize 类型
    enumInterpolationFlags{/**nearestneighborinterpolation*/INTER_NEAREST=0,/**bilinearinterpolation*/INTER_LINEAR=1,/**bicubicinterpolation*/INTER_CUBIC=2,/**resamplingusingpixel......