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# 图像处理​赞同​添加评论​分享​喜欢​收藏​设置

posted @ 2023-04-21 10:37  cps666  阅读(22)  评论(0编辑  收藏  举报