第 19 讲:数组(一):一维、二维和高维数组
我们将进入一个新的板块:数组(Array)。数组是将一系列数据归并放在一起处理的一种特殊的数据类型。在 C# 里,一共有三种数组:多维数组(Multi-dimensional Array)、锯齿数组(也叫交错数组,Jigsaw Array)和混合数组(Mixed Array)。下面我们挨个介绍一下。
和 C 语言的数组的概念一样,但用法不同,所以我们给大家介绍具体写法格式的时候,希望你能多练习、多理解。
Part 1 一维数组
在 C 语言里,我们使用中括号,追加到变量之后,来表达和区分它和普通的变量不同。在 C# 里,我们这么书写:
C# 里拥有上述三种书写格式。第一种,我们使用 new
语句,在后面书写 int[3]
来表达数组长度是 3;第二种,我们使用 new
语句,在后面初始化数组的每一个元素;第三种是第二种的简写。在初始化的时候,可以不写 new int[]
当然,第二种写法里
new int[]
也可以写出来长度(后面有 6 个元素,因此可以写成new int[6]
。但是这个 6 是跟着后面元素个数的,因此这个 6 可以省略)。另请注意,C# 把
int
类型的数组变量记作int[]
,即写在类型的右侧紧跟一个中括号。
使用数组,我们可以采用中括号来获取数组指定位置上的数值。
这样一来, a
、b
、c
和 d
四个变量分别是 1、2、4 和 8。中括号里的数值称为下标(也叫索引,Index)。C# 里规定,数组下标从 0 开始,即第一个元素要写成 [0]
,第二个元素要写成 [1]
可能你会问我,如果我写了一个过大或者过小的索引,比如说
arr[-1]
或者arr[100]
,会怎么样呢?答案当然很简单:由于这种行为是非预期的行为,因此结果当然了产生异常了。实际上,运行期间,你就会看到,这样的代码会产生一个所谓的IndexOutOfRangeException
类型的异常,这刚好代表你传入的索引是无效的:out of range 不就是超出范围的意思嘛。
另外,我们还可以使用 for
循环,对每一个元素进行取值:
比如这样,我们使用 for
另外,在 C# 里,我们如果取出数组总长度,我们使用的是 .Length
语法。我们直接在数组本身后追加 .Length
来取出数组一共多少个元素。这一点和 C 语言不同:C 语言的数组是取长度是用的 sizeof(数组) / sizeof(元素类型)
。
不过,C# 还允许另外一种循环类型:foreach
循环。在循环的内容里,我们没有讲解这个类型的循环,因为这个循环类型必须使用数组或别的集合才可以使用。它的格式是 foreach (类型 变量名 in 集合)
。
这种循环类型专门针对于一个数组来用的话,我们就不必使用索引来写那么长了;从 foreach
循环来看,element
就是数组里面的每一个元素。直接取出数值本身,然后 element
就是已经是元素本身了。
目前来说,foreach
对数组可用;但是别的可以用 foreach
Part 2 二维数组
和一维数组不一样的是,二维数组是两个维度的数组类型。你可以当成一个矩阵。
我们使用这样的语法,来初始化一个二维数组的每一个元素。当然,new int[3, 4]
是可以不写的;就算要写的话,这里的 3 和 4 也可以不写:new int[,]
。注意这种语法格式。类型写的是 int[,]
,这表示 int
作为元素本体的数组类型,数组是二维数组,因为中括号里用了一个逗号。一个逗号表示将数组分成两个维度。
注意语法格式。arr[0, 0]
表示取第 1 行第 1 列的元素,arr[1, 0]
表示取第 2 行第 1 列的元素。和前文一样,0 表示第一个。
另外,通过 for
最后,使用 .Length
得到的结果,可能和你预期结果不一样。.Length
取出来的结果是数组总的元素个数;二维数组虽然有维度的概念,但 .Length
照样取的是所有维度所有元素个数的总和。
Part 3 高维数组
高维数组专门指代三维及其以上的数组类型。我们拿三维数组举例:
三维数组虽然排版不是很好理解,不过你可以认为这是一个有长、有宽、有高的三维矩阵。另外,new int[2, 3, 4]
也可以不写;也可以写成 new int[,,]
。两个逗号将中括号分成三部分,暗示是三个维度。
遍历和前文一致,使用 .GetLength
来获取每一个维度的长度,foreach
循环获取每一个元素。
三维数组以及别的高维数组是一样的,.Length