数组是一个变量的索引列表,存储在数组类型的变量中。
数组有一个基本类型,数组中的各个条目都是这种类型。数组的条目通常称为元素。
第一个条目的索引是0 , 第二个条目的索引是1 , 以此类推。
01. 声明数组
<baseType>[] <name>;
其中,<baseType> 可以是任何变量类型,包括枚举和结构类型。
数组必须在访问之前初始化,数组的初始化有两种方式:可以字面值形式指定数组的完整内容,也可以指定数组的大小,再使用关键字 new 初始化所有数组元素。
int [] myIntArray = { 21, 2, 354, 7, 99 };
int [] myIntArray = new int [ 5 ] ;
这里使用关键字 new 显式地初始化数组,用一个常量值定义其大小。这种方式会给所有数组元素赋予同一个默认值,对于数值类型来说,其默认值是0。
也可以使用非常量的变量来进行初始化,例如:
int [] myint Array = new int [arraySize] ;
如果使用变量定义其大小,该变量
必须是一个常量,例如:
const int arraySize = 5;
int[] myintArray = new int[arraySize] { 21, 2, 354, 7, 99 };
如果省略了关键字const(常量),运行这段代码就会失败。
与其他变量类型一样,并非必须在声明数组的代码行中初始化该数组。
02. foreach 循环
foreach 循环可以使用一种简便的语法来定位数组中的每个元素:
foreach (<baseType> <name> in <array>)
{
//can use <name> for each element
}
这个循环会迭代每一个元素,依次把每个元素放在变量 <name> 中,且不存在访问非法元素的风险。不需要考虑数组中有多少个元素,并可以确保将在循环中使用每一个元素。
foreach循环对数组内容进行只读访问,所以不能改变任何元素的值;for循环可以给数组元素赋值。
03. 使用 switch case 表达式进行模式匹配
可以基于变量的类型(如string或int数组)在 switch case 中进行模式匹配。因为变量的类型是已知的,所以可以访问该类型提供的方法和属性。
switch (<testVar>)
{
case int value:
<code to execute if <testVar> is an int>
break;
case string s when s.Length == 0:
<code to execute if <testVar> is an string with a Length = 0>
break;
...
case null:
<code to execute if <testVar> = null>
break;
default:
<code to execute if <testVar> != comparisonVals>
break;
}
case 关键词之后紧跟的是想要检查的变量类型(string、int等)。
在case语句匹配时,该类型的值将保存到声明的变量中。例如,若<testVar>是一个integer类型的值,则该integer的值将存储在变量 value 中。接下来将when关键字修饰符应用到了switch case表达式。when关键字修饰符允许扩展或添加一些额外的条件,以执行case语句中的代码。
04. 多维数组
多维数组是使用多个索引访问其元素的数组。
例如,假设要确定一座山相对于某个位置的高度,使用两个坐标X和Y来确定一个位置,把这个坐标用作索引,让数组hillHeight可以用每对坐标来存储高度,这就需要用到多维数组。
二维数组: <baseType>[,] <name>;
多维数组: <baseType>[,,,] <name>;
如果声明并初始化一个二维数组 hillHeight ,其基本类型为 double ,X大小是3,Y大小是4,则:
double[,] hillHeight = new double[3,4];
还可以使用字面值进行初始赋值:
double[,] hillHeight = { [ 1, 2, 3, 4], [ 2, 3, 4, 5], [ 3, 4, 5, 6] };
可以使用 foreach循环访问多维数组中的所有元素,方式与访问一维数组相同:
double[,] hillHeight = { [ 1, 2, 3, 4], [ 2, 3, 4, 5], [ 3, 4, 5, 6] };
foreach (double height in hillHeight)
{
WriteLine($"(height)");
}
05. 数组的数组
数组中每一个元素都是另一个数组,也可以有数组的数组的数组,甚至更加复杂的数组。这些数组都必须是相同的数据类型。锯齿数组(jagged array),每行的元素个数不同。
声明数组的数组时,在声明中指定多个方括号对:
int [][] jaggedIntArray;
不能采用以下方式:
- jaggedIntArray = new int[3][4];
- jaggedIntArray = {{1,2,3}, {1}, {1,2} };
可以初始化包含其它数组的数组,然后依次初始化子数组:
jaggedIntArray = new int[2][];
jaggedIntArray[0] = new int[3];
jaggedIntArray[1] = new int[4];
也可以使用字面值赋值的改进形式:
jaggedIntArray = new int[3][] { new int[] {1,2,3}, new int[] {1}, new int[] {1,2} };
把数组的初始化和声明放在同一行上:
int [][] jaggedIntArray = { new int[] {1,2,3}, new int[] {1}, new int[] {1,2} };