C#数组详解:从基础概念到高级用法
C#数组详解:从基础概念到高级用法
数组是C#编程中常用的数据结构,用于存储一组相同类型的元素。本文将详细介绍数组的基本概念、声明方式、初始化方法以及各种高级用法,包括多维数组和锯齿数组等。
数组是一个变量的索引列表,存储在数组类型的变量中。数组有一个基本类型,数组中的各个条目都是这种类型。数组的条目通常称为元素。第一个条目的索引是0,第二个条目的索引是1,以此类推。
1. 声明数组
数组的声明格式如下:
<baseType>[] <name>;
其中,<baseType>
可以是任何变量类型,包括枚举和结构类型。数组必须在访问之前初始化,数组的初始化有两种方式:可以字面值形式指定数组的完整内容,也可以指定数组的大小,再使用关键字new
初始化所有数组元素。
int[] myIntArray = { 21, 2, 354, 7, 99 };
int[] myIntArray = new int[5];
这里使用关键字new
显式地初始化数组,用一个常量值定义其大小。这种方式会给所有数组元素赋予同一个默认值,对于数值类型来说,其默认值是0。
也可以使用非常量的变量来进行初始化,例如:
int[] myintArray = new int[arraySize];
如果使用变量定义其大小,该变量必须是一个常量,例如:
const int arraySize = 5;
int[] myintArray = new int[arraySize] { 21, 2, 354, 7, 99 };
如果省略了关键字const
(常量),运行这段代码就会失败。与其他变量类型一样,并非必须在声明数组的代码行中初始化该数组。
2. foreach 循环
foreach
循环可以使用一种简便的语法来定位数组中的每个元素:
foreach (<baseType> <name> in <array>)
{
//can use <name> for each element
}
这个循环会迭代每一个元素,依次把每个元素放在变量 <name>
中,且不存在访问非法元素的风险。不需要考虑数组中有多少个元素,并可以确保将在循环中使用每一个元素。
foreach
循环对数组内容进行只读访问,所以不能改变任何元素的值;for
循环可以给数组元素赋值。
3. 使用 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
语句中的代码。
4. 多维数组
多维数组是使用多个索引访问其元素的数组。例如,假设要确定一座山相对于某个位置的高度,使用两个坐标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)");
}
5. 数组的数组
数组中每一个元素都是另一个数组,也可以有数组的数组的数组,甚至更加复杂的数组。这些数组都必须是相同的数据类型。锯齿数组(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} };