【C#语言规范版本5.0学习】1.7 数组
数组 (array) 是一种包含若干变量的数据结构,这些变量都可以通过计算索引进行访问。
数组中包含的变量(又称数组的元素)具有相同的类型,该类型称为数组的元素类型。
数组类型为引用类型,因此数组变量的声明只是为数组实例的引用留出空间。实际的数组实例在运行时使用 new 运算符动态创建。
new 运算符指定新数组实例的长度 (length),它在该实例的生存期内是固定不变的。
数组元素的索引范围从 0 到 Length - 1。new 运算符自动将数组的元素初始化为它们的默认值, 例如将所有数值类型初始化为零,将所有引用类型初始化为 null。 下面的示例创建一个 int 元素的数组,初始化该数组,并打印该数组的内容。
using System; class Test { static void Main() { int[] a = new int[10]; for (int i = 0; i < a.Length; i++) { a[i] = i * i; } for (int i = 0; i < a.Length; i++) { Console.WriteLine("a[{0}] = {1}", i, a[i]); } } }
此示例创建并操作一个一维数组 (single-dimensional array)。C# 还支持多维数组 (multi-dimensional array)。 数组类型的维数也称为数组类型的秩 (rank),它是数组类型的方括号之间的逗号个数加 1。下面的示例分别分配一个一维数组、一个二维数组和一个三维数组。
int[] a1 = new int[10]; int[,] a2 = new int[10, 5]; int[,,] a3 = new int[10, 5, 2];
a1 数组包含 10 个元素,a2 数组包含 50 (10 × 5) 个元素,a3 数组包含 100 (10 × 5 × 2) 个元素。
数组的元素类型可以是任意类型,包括数组类型。对于数组元素的类型为数组的情况,我们有时称之为交错数组 (jagged array),原因是元素数组的长度不必全都相同。下面的示例分配一个由 int 数组组成的数组:
int[][] a = new int[3][]; a[0] = new int[10]; a[1] = new int[5]; a[2] = new int[20];
第一行创建一个具有三个元素的数组,每个元素的类型为 int[] 并具有初始值 null。接下来的代码行使用对不同长度的数组实例的引用分别初始化这三个元素。
new 运算符允许使用数组初始值设定项 (array initializer) 指定数组元素的初始值,数组初始值设定项是在一个位于定界符 { 和 } 之间的表达式列表。下面的示例分配并初始化具有三个元素的 int[]。
int[] a = new int[] {1, 2, 3};
注意数组的长度是从 { 和 } 之间的表达式个数推断出来的。对于局部变量和字段声明,可以进一步简写, 从而不必再次声明数组类型。
int[] a = {1, 2, 3};
前面的两个示例都等效于下面的示例:
int[] t = new int[3]; t[0] = 1; t[1] = 2; t[2] = 3; int[] a = t;
补充
多维数组的声明
在声明时,必须指定数组的长度,格式为 type [lenght ,lenght ,lengh, ... ]
int
[,] test1 =
new
int
[3,3];
交错数组的声明
声明时,至少需要指定第一维的长度,格式为 type [ ] [ ] [ ] ...
int [][] test1 = new int[5][];
int [][] test1 = new int[][]; //注意,此的声明方式是错的
多维数组、交错数组的区别
两者声明时,都必须指定长度,多维数组必须指定每一维的长度,而交错数组需要至少需要指定第一维的长度。
多维数组声明时,符号是这样的 [ , , , , ],逗号在 方括号 [ ] 中,每一维长度用逗号分隔。而交错数组每一维独立在 [ ]中
交错数组的每一维都是一个实例,每一个实例为一个数组。
//交错数组 int[][] a = new int[3][]; a[0] = new int[] { 1, 2, 3, 4 }; a[1] = new int[] { 11, 12, 13 }; a[2] = new int[] { 21, 22, 23 }; for (int i = 0; i < a.Length; i++) { //Console.WriteLine("a[{0}]:{1}", i, a[i][0]); for (int j = 0; j < a[i].Length; j++) { Console.WriteLine("a[{0}][{1}]:{2}", i, j, a[i][j]); } } // a[0][0]:1 //a[0][1]:2 //a[0][2]:3 //a[0][3]:4 //a[1][0]:11 //a[1][1]:12 //a[1][2]:13 //a[2][0]:21 //a[2][1]:22 //a[2][2]:23
//多维数组
int[,] inti = new int[2, 3] { { 1, 2, 3 }, { 4, 5, 6 } }; //定义一个2行3列的二维数组inti,并为其赋值. inti[1, 0] = 5;//改变inti[1,0]也就是第二例,第一行的元素的值为5. for (int i = 0; i <inti.GetLength(0); i++) //inti.GetLength()方法为获取数组指定维的元素个数. { for (int j = 0; j <inti.GetLength(1); j++) //第一个for循环遍历二维数组的列,第二个for循环遍历二维数组的行. { Console.WriteLine(inti[i, j]); //打印inti数组中指定元素的值. }
获取数组长度
//多维数组 int[,] test1 = { {1,2,3}, {1,2,3}, {1,2,3} }; Console.WriteLine(test1.Length);//9 //交错数组 int[][] test2 = { new int[] {1,2,3}, new int[] {1,2,3}, new int[] {1,2,3} }; Console.WriteLine(test2.Length);//3
多维数组错误示例
//多维数组 int [,] test1 = { {1,2,3,4}, {1,2,3}, {1,2} }; //这样是错的,长度必须一致<br><br> int [,] test1 = new int [4,5] { {1,2,3,4,5}, {1,2,3}, {1,2,3} }; //这样也是错误的,长度必须一致,必须为每一个位置赋值