数组
数组是最常用的数据结构(数据单元的集合)。c#数组分三类,一类是一维数组;二、多维数组;三、交错数组。
一、语法
1.一维数组:
定义:元素类型[] 数组名;
初始化一维数组: 元素类型[] 数组名={第一个元素,第二个,,,,}
使用数组: 数组名[下标]
例子:
int[] a = {1,2,3} //定义一个元素为int的数组,然后初始化为3个元素(1,2,3)的集合。
a[0];//第一个元素,即1
a[2];//第三个元素,即3
a[1] = 100; //第二个元素修改为100;
2.多维数组:
定义:元素类型[ , ] 数组名; //一个逗号分隔出两部分表示2维,两个逗号分隔出三部分表示3维。
初始化多维数组: 元素类型[ , ] 数组名 = { {1,2,3}, {4,5,6} };// 多维数组的初始化是嵌套式的,最里面一层大括号表示最后一维的列表,如{1,2,3}这部分,然后往外扩展,表示前一维的元素列表,如把{1,2,3} 看作是a, {4,5,6} 看作是b,那么a,b 就是前一维的元素列表. 例子最后一维是3个元素的列表,向前一维是两个元素的列表,即是[2, 3] 的二维数组。
定义三维依此类推:int [ , , ] a = { { {1}, {2}, {3} }, { {4},{5}, {6} } }。先看最里面{1},也就是最后一维是1,把{1},{2},{3}等列表视为元素,即{ { a,b,c }, { d,e,f } }, 可见这一层最里面的括号是3个元素;继续把{a,b,c}等列表视为一个元素{ A, B } 可见是2个元素。总结就是 int [2, 3, 1] 的数组。
需要注意,同层的列表的大小是一致的,比如你不能定义 { {1,2}, {3} } 这种列表,因为{1,2} 和 {3} 是同一级,个数应该相等。
使用多维数组:数组名[下标, 下标]
例子:
int[,,] a = { {{1,2,3},{4,5,6}}, {{7,8,9},{10,11,12}} };
a[0,1,2]; //第一维的第一个元素,即{{1,2,3}, {4,5,6}},并且是第二维的第二个元素,即{4,5,6},并且是第三维的第三个元素,即 6 .
3.交错数组
多维数组要求同一个层的元素个数一致,如果不希望这样,就可以使用交错数组。“交错”的意思就是可以多也可以少。但从技术上讲,交错数组只不过是元素类型是数组的一种普通数组而已。因为元素类型本身是数组,那么自然就可以做到不同元素有不同的长度。
定义:元素类型[][] 数组名; //你也可以将"元素类型[]”这部分视为“元素类型”,那么就和普通数组一摸一样了。并且可以继续扩展,把“元素类型[][]”视为“元素类型”用来定义三维的交错数组。
初始化交错数组:元素类型[][] = {new 元素类型[长度], new 元素类型[长度],,,,}。 可见,这根本上就是普通的一维数组,只是每个元素是数组而已。需要注意,每个元素都需要创建数组类型,而不能用二维数组采取的列表方式去初始化元素。(初始化列表并非数组类型,而只是一种初始化格式,因此只是针对数组本身,而不优待其元素。)
使用交错数组:数组名[一维下标][二维下标]
需要注意的是,第一个括号的下标是数组本身的下标,第二个才是元素的下标。
例子:
int[][][] a = { new int[2][], new int[3][] };
a[0][1] = new int[3];
a[1][0] = new int[2];
a[0][1][2] = 1;
a[1][0][1] = 2;
//那么a这个交错数组的所有值是什么?
a[0] == int[2][]
a[0][0] == null;
a[0][1] == new int[3]{0,0,1}
a[0][1][0] == 0;
a[0][1][1] == 0;
a[0][1][2] == 1;
a[1] == int[1][]
a[1][0] == new int[2]{0,2}
a[1][1] == null;
a[1][2] == null;
a[1][0][0] == 0;
a[1][0][1] == 2;
即 a == { { {null}, {0,0,1} }, { { {0,2} }, {null}, {null} } }。 因为数组是引用类型,如果没有赋值,默认是null。观察一下交错数组a, 第二维的第一个元素长度是2,第二个长度却是3;第三维度,第一个元素干脆就不存在,是null,第二个元素{0,0,1}长度是3.第三个元素{0,2}长度是2;第4,5是null。可见真的很“交错”。
二、注意事项
c#数组的定义语法很奇特。
比如你可以定义一个数组变量 int[] a; 但是你不能指定长度, 即 int [1] a;是错误的!
你可以用列表初始化它,但不能用列表赋值给它。如 int[] a = {1,2} 。但之后 a = {3, 4};错误。
你可以用不同长度的数组去赋值你的变量int[] a = {1}; a= new int[10]; 数组变量本身只是保存指向数组的指针,换赋值的结果不过是指向新的数组。
new int[3] 是表示创建一个3个元素的数组,但下标不是1到3,而是0~2,第一个元素是0,第三个元素是2.
虽然数组的类型并没有长度,但是你必须创建一个有长度的数组赋值给它。如int [] a = new int[]; 是错误的。这还不算什么,只需要给出大小就行了,问题是如果是一个int[][][][][] a 的数组你应该怎么赋值?
是new int[1][2][3][4][5] ? 答案是否定的!记住, int[1][2] 不是类型,类型是什么?是int [][] ,数组的类型是没有长度的。
那么为何要new int[1] 这种写法?这不过是误导而已。其实这不过是等价于new int [] 并设置长度两个步骤,并非数组类型本身有长度。而c#把设置长度放在数组括号里面而已。因此,对于任何类型的数组的创建,只需要给出类型,并在数组括号内给出长度便可。
根据交错数组的定义,不过是元素是数组的普通数组,因此创建这种数组,自然只需给出数组的长度和数组本身的类型。数组的类型是int [][][][][],长度是2,那么剩下来的问题就是放在那个括号里面而已。根据交错数组的定义,第一个维度是数组自身的维度,那么只需要放在第一个括号里面,那么自然就是new int [2][][][][]这种格式。
也可以省略长度,只需要给出列表便可。如new int[][][][][]{ new int[4][][][], new int[2][][][] }; 自然长度就是2. 元素类型是少一个维度的数组。交错数组需要一层一层的创建对应的数组。