数组

数组是最常用的数据结构(数据单元的集合)。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. 元素类型是少一个维度的数组。交错数组需要一层一层的创建对应的数组。

posted @ 2012-12-06 13:33  诺贝尔  阅读(963)  评论(3编辑  收藏  举报