数组
10.1 数组
ps:建议多使用一维数组和交错数组(性能更高)
数组实际上是由一个变量名称表示的一组同类型的数据元素。每个元素通过变量名称和一个或多个方括号中的索引来访问
数组的访问方式:
数组名 索引
MyArray[index]
10.1.1 关于数组的重要定义
- 元素 数组的独立数据项称作元素。数组的所有元素必须是相同类型的,或继承自相同类型
- 秩/维度 数组可以有任何为正数的维度数。数组的维度称作 秩
- 维度长度 数组的每一个维度有一个长度,就是这个方向的位置个数
- 数组长度 数组的所有维度中的元素的总和称作数组的长度
在C#中数组一旦创建,大小就固定了(C#不支持动态数组)
数组的索引从 0 开始
10.2 数组的类型
C#提供了两种类型的数组
- 一维数组可以认为是单行元素或元素向量
- 多维数组是由主向量中的位置组成,每一个位置本身又是一个数组,称为子数组。子数组向量中的位置本身又是一个子数组
- 还有两种类型的多维数组:矩阵数组和交错数组
矩阵数组和交错数组的特征
矩阵数组
某个维度的所有子数组有相同长度的多维数组
不管有多少维度,总是使用一组方括号
ps:int x = myArray[4, 6, 1]
交错数组
每一个子数组都是独立数组的多维数组
可以有不同长度的子数组
为数组的每一个维度使用一对方括号
ps:Array[2][7][4]
10.3 数组是对象
数组实例是从System.Array继承的对象。由于数组是从BCL基类继承,它们也继承了很多有用的方法
- Rank 返回数组维度数的属性
- Length 返回数组长度(数组中所有元素的个数)的属性
尽管数组总是引用类型,但是数组的元素可以是值类型也可以是引用类型
- 如果存储的元素都是类值类型,数组被称作值类型数组
- 如果存储在数组中的元素都是引用类型对象,数组被称为引用类型数组
10.4 一维数组
一维数组的声名:
秩说明符:, 英文逗号
数据类型[ 秩说明符 ] 数组名;
一维数组声明并实例化的方式:
数据类型 [] 数组名 = new 数据类型[ 数组长度 ];
数据类型 [] 数组名 = new 数据类型[]{ 数据1, 数据2, ....};
数据类型 [] 数组名 = { 数据1, 数据2, ....};
数据类型 [] 数组名 = new 数据类型[ 数组长度 ]{ 数据1, 数据2, ....};
10.5 矩阵数组
矩阵数组的声明:
数据类型 [ , , ] 数组名; //三维数组
数据类型 [ , ] 数组名; //二维数组
矩形数组的声明应注意以下几点:
- 可以使用任意多的秩说明符
- 不能在数组类型区域中放数组维度长度。秩是数组类型的一部分,而维度长度不是类型的一部分
- 数组声明后,维度数就是固定的了。然而,维度长度直到数组实例化时才会确定
矩阵数组的实例化:
ps:int [ , , ] arr = new int [3,6,2];
矩阵数组实例化和为数据初始化方式类似
10.6 交错数组
交错数组是数组的数组。与矩阵数组不同,交错数组的子数组的元素个数可以不同
// arr是3个int数组的数组(读法)
int [][] arr = new int [3][]; //声明并创建顶层数组
... //声明并创建子数组
声明方式:
交错数组的声明语法要求每一个维度都有一对独立的方括号。数组变量声明中的方括号数决定了数组的秩
- 交错数组可能的维度可以是大于1的任意整数
- 和矩形数组一样,维度长度不能包括在数组类型的声明部分
int[][] SomeArr;
//秩等于2
int[][][] OtherArr;
/秩等于3
实例化交错数组
int [][] Arr = new int[3][]; //实例化顶层数组
Arr[0] = new int []{1, 2, 3}; //实例化子数组
Arr[1] = new int []{12, 22, 32, 42}; //实例化子数组
Arr[2] = new int []{10, 20, 30, 40, 50}; //实例化子数组
10.7 数组继承的有用成员(部分)
成员 | 类型 | 生存期 | 意义 |
---|---|---|---|
Rank | 属性 | 实例 | 获取数组的维度数 |
Length | 属性 | 实例 | 获取数组中所有维度的元素总和 |
GetLength | 方法 | 实例 | 返回数组的指定维度的长度 |
Clear | 方法 | 静态 | 将某一范围内的元素设置为0或nu1l |
Sort | 方法 | 静态 | 在一维数组中对元素进行排序 |
BinarySearch | 方法 | 静态 | 使用二进制搜索,搜索一维数组中的值 |
Clone | 方法 | 实例 | 进行数组的浅复制——对于值类型数组和引用类型数组,都只复制元素 |
Indexof | 方法 | 静态 | 返回一维数组中遇到的第一个值 |
Reverse | 方法 | 静态 | 反转一维数组中的某一范围内的元素 |
GetUpperBound | 方法 | 实例 | 获取指定维度的上限 |
10.8 foreach语句
foreach语法:
froeach( Type Indentifiter in ArrayNmae) { Satement }
- 迭代变量是临时的,并且和数组中元素的类型相同。foreach语句使用迭代变量来相继表示数组中的每一个元素
- Type 是数组中元素的类型,可以显示提供,也可以使用 var 隐式的通过编译器来推断
- Indentifiter 迭代变量的名字
- ArrayName 要处理数组的名字
- Satement 语句或语句块