C#学习笔记 -- 数组: 一维数组、矩形数组
1、数组定义
-
元素: 数组的独立数据项是元素, 类型相同或继承自同一类型
-
秩/维度: 数组的维度可以为任何正数
-
维度长度: 每一维度的长度
-
数组长度: 数组中所有维度中的严肃总数
注意
-
数组一旦创建, 大小固定, 不支持动态数组
2、数组分类
-
一维数组: 可以认为是单行元素或元素向量
-
多维数组: 是由主向量中的位置组成的, 每个位置本身又是一个数组, 称为字数组, 子数组向量中的位置本身又是一个子数组
-
矩阵数组
-
某个维度的所有子数组具有相同的长度的多为数组
-
不管有多少维, 总是用一组方括号表示
int x = myArray[4, 6, 1];//三维
-
-
交错数组
-
每一个子数组都是独立数组的多位数组
-
可以有不同长度的子数组
-
为数组的每个维度使用一对方括号
jagArray[2][7][4];
-
3、数组是对象
数组实例是继承自System.Array
的对象, 由于数组从BCL基类派生, BCL基类中有很多有用的成员
-
Rank
返回数组维度数的属性 -
Lenth
返回数组长度的属性(数组中所有元素的个数)
数组是引用类型, 与所有引用类型一样, 数组有数据的引用以及对象本身, 引用在栈或堆上, 而数组对象本身总是在堆上
尽管数组是引用类型, 但是数组的元素可以是值类型也可以是引用类型
-
存储的元素都是值类型, 数组被称为类型数组
-
存储的元素都是引用类型, 被称为引用类型数组
4、一维、矩阵数组
声明
long[,,,] sencondArray;
-
方括号里的逗号就是秩说明符, 他们指定了数组的维度数,
逗号数 + 1 = 维数
-
不能在数组类型区域放数组维度长度, 秩是数组类型的一部分, 而维度长度不是类型的一部分
-
数组声明后, 维度数就是固定的, 然而维度擦好牛高度直到数组实例化才会确定
5、实例化
int[] arr2 = new int[4];
MyClass[] mcArr = new MyClass[4];
int[,,] arr3 = new int[3, 6, 2]; //三维数组, 长度是3*6*2 = 36
-
arr数组是包含4个int的一维数组
-
mcArr数组是包含4个MyClass引用的一维数组
6、访问数组元素
-
每个维度的索引从0开始
-
方括号内的索引在数组名称之后
int[,] intArr2 = new int[5, 10];//二维数组
intArr2[2, 3] = 7; //向二维数组写入元素
int var2 = intArr2[2, 3]; //读二维数组元素
7、初始化
当数组被创建之后, 每一个元素被自动初始化为类型的默认值, 对于预定义的类型, 整型默认值0, 浮点默认值0.0, bool默认值false, 引用默认值null
int[] intArr = new int[4];
(1)显式初始化一维数组
对于一维数组, 实例化后加上一个初始化列表
int[] intArr = new int[] {10, 20, 30, 40};
-
不必输入维度长度, 因为编译器可以通过初始化的值的个数来判断长度
-
在数组创建表达式和初始化列表中间没有分隔符
(2)显式初始化矩阵数组
int[,] intArry2 = new int[,] {{10, 1}, {2, 10}, {11, 9}};
-
每个初始量向量必须封闭在大括号内
-
每个维度也必须签到并封闭在大括号内
-
除了初始值, 每个维度的初始化列表必须用逗号分割
(3)初始化矩形数组
矩形数组使用嵌套的, 逗号分割的初始化列表进行初始化, 初始化列表嵌套在大括号内. 这有时会造成混淆, 因此, 对于嵌套、分组和逗号的正确使用如下
-
,
用作元素和分组之间的分隔符 -
,
不在左大括号之间使用 -
,
不在右大括号之间使用 -
使用缩进和回车来分组
-
从左向右阅读秩说明符, 指定最后一个数字作为元素, 其他数字作为分组
int[,,] matrixArray = new int[行数, 列数, 元素个数]{};
int[,,] intArray = new int[4,3,2]{
{ {1, 1}, {1, 2}, {1, 3} },
{ {2, 1}, {2, 2}, {2, 3} },
{ {3, 1}, {3, 2}, {3, 3} },
{ {4, 1}, {4, 2}, {4, 3} }
};
(4)快捷语法
在一条语句中使用声明、数组、初始化创建时, 我们可以省略语法的数组创建表达式部分, 只需提供初始化部分
int[] arr1 = new int[3] {1, 2, 3};
//等价
int[] arr1 = {1, 2, 3};
int[,] arr2 = new int[2, 3] { {1, 2, 3}, {4, 5, 6} };
//等价与
int[,] arr2 = { {1, 2, 3}, {4, 5, 6} };
(5)隐式类型数组
-
当初始化数组时, 可以让编译器根据处死和化语句的类型来判断数组, 只要所有初始化语句能隐式转换为单个类型, 就可以这么做
-
和隐式类型局部变量一样, 使用var关键字来代替数组类型
//显式
int[] intArr1 = new int[] {10, 20, 30};
//隐式
var intArr1 = new {10, 20, 30};
//显式
int[,] intArr3 = new int[2, 2] {{1, 2}, {3, 4}};
//隐式
var intArr3 = new {{1, 2}, {3, 4}};
例子
static void Main(string[] args)
{
//1307_6
{
var arr = new int[2, 3] { { 0, 1, 2 }, { 10, 11, 12 } };
Console.WriteLine($"arr维数: {arr.Rank}");
Console.WriteLine($"arr维数: {arr.GetLength(0)}");
for (int i = 0; i < arr.GetLength(0); i++) //i: 1维元素数 ==> 秩数
{
for (int j = 0; j < arr.GetLength(1); j++) //j: 1维的元素数
{
Console.WriteLine($"Element[{i}, {j}]: {arr[i, j]}");
}
}
}
}