本章主要介绍在C#中使用数组的相关知识。数组是大部分编程语言都支持的一种数据类型,使用比较方便,能处理一定的复杂问题。本章将先介绍数组的相关概念,然后逐渐介绍如何访问数组的元素,对其进行遍历、查找和排序等常见操作。
本章主要内容
& 一般数组和多维数组
& 数组的声明与创建
& 访问数组的元素
& 对数组进行各种操作
& 动态创建数组
& 综合实例
本节介绍数组的基本知识以及如何创建数组。尽管数组的名称中包含“数”这个汉字,但数组内的元素却不一定只是数值类型。为了读者理解方便,本节尽可能选取一些数值类型的数组进行演示。
从字面意义上理解数组的概念,可以解释为“一组数”,但正确的理解应该为“一组元素”,这组元素具有相同的类型和名称。在使用时,为了区别数组中的元素,需要使用下标。不同的下标表示数组中不同的元素,配合数组的名称便可以访问数组中的所有元素。C#中,数组的下标是从0开始的,数组的长度定义为数组中包含元素的个数。
数组中的元素可以是数值,如下的代码定义了一个整型的数组:
int[] a;
普通变量的声明如下:
int a;
由此可见,在声明时的区别在于中括号的使用。整型关键字int后加一对中括号时声明的a是一个整型的数组,而直接使用整型关键字int声明的a为一个整型变量。数组中也可以包含其他类型的元素,如下的代码定义了一个字符串类型的数组:
string[] a;
同样,可以有许多种其他类型的数组,这里不作详细说明。数组的直观理解可以用图4-1进行说明。
1 |
2 |
3 |
4 |
5 |
图4-1 数组
假设图4-1展示的是一个数组x,该数组中的元素为“1、2、3、4、5”。显然,该数组的长度为5。根据前面介绍的下标概念,可以知道“1、2、3、4、5”的访问方式分别应该为“x[0]、x[1]、x[2]、x[3]、x[4]”。
相对于4.1.1小节介绍的数组概念,本小节介绍一种更为复杂的数组。试看图4-2所表示的数组。
1 |
2 |
3 |
4 |
5 |
1 |
2 |
3 |
4 |
5 |
1 |
2 |
3 |
4 |
5 |
1 |
2 |
3 |
4 |
5 |
1 |
2 |
3 |
4 |
5 |
图4-2 复杂数组
此时可以用上小节中介绍的方式,以一个长度为25的数组表示图4-2中的元素,即可以将图4-2转化为如图4-3所示的形式。
1 |
2 |
3 |
4 |
5 |
1 |
2 |
3 |
4 |
5 |
1 |
2 |
3 |
4 |
5 |
1 |
2 |
3 |
4 |
5 |
1 |
2 |
3 |
4 |
5 |
图4-3 复杂数组的转换
这时可以用x[0]~x[24]来访问该数组中的元素。但C#中提供了一种更为简便的方式,即多维数组。可以将多维数组看成是由数组构成的数组,例如,将图4-2表示的数组看作5个数组,其中每个数组为长度为5的数组。其中每一行为一个数组,这5行又分别作为数组中的元素构成了另一个数组。
当构成一个多维数组x时,x[0,0]~x[4,4]中的x[0,*]~x[4,*]表示图4-2中的5行。若要访问每一行中的元素,如第一行的第一个元素,则可以使用x[0,0]进行访问。运用这种规则,可以构成任意复杂维度的数组。声明多维数组的方法非常简单,如下的代码声明了一个整型二维数组:
int[,] a;
同样,也可以声明其他类型的数组,如下的代码声明了一个字符串类型的二维数组:
string[,] a;
前几节介绍了普通数组和多维数组的概念,并给出了声明相应类型数组的方法。本节介绍如何在C#中创建数组,下面通过一个实例进行说明。
创建一个Windows控制台应用程序,使用不同的方式声明数组。
(1)创建一个名为CreateArray的控制台应用程序项目。
(2)修改Program.cs文件中Main方法的内容如下:
static void Main(string[] args)
{
//创建方式1
int[] a = { 1, 2, 3, 4, 5 };
Console.WriteLine(a[0]);
Console.WriteLine(a[1]);
Console.WriteLine(a[2]);
Console.WriteLine(a[3]);
Console.WriteLine(a[4]);
//创建方式2
int[] b = new int[5] { 6, 7, 8, 9, 10 };
Console.WriteLine(b[0]);
Console.WriteLine(b[1]);
Console.WriteLine(b[2]);
Console.WriteLine(b[3]);
Console.WriteLine(b[4]);
//创建方式3
int[] c = new int[5];
c[0] = 11;
c[1] = 12;
c[2] = 13;
c[3] = 14;
c[4] = 15;
Console.WriteLine(c[0]);
Console.WriteLine(c[1]);
Console.WriteLine(c[2]);
Console.WriteLine(c[3]);
Console.WriteLine(c[4]);
}
按Ctrl+F5组合键运行程序,运行结果如图4-4所示。
图4-4 运行结果
(1)创建方式1。方式1中没有明确指出数组的长度,但直接使用数值“1”、“2”、“3”、“4”和“5”对其进行了初始化。随后对其进行了访问,并输出至控制台窗口中。
(2)创建方式2。方式2使用new关键字创建了一个int型的数组,不仅限定了数组的长度,并且进行了初始化。这也是一种声明数组的方式。随后对其进行了访问,并输出至控制台窗口中。
(3)创建方式3。方式3在创建数组时只限定了数组的长度,初始化的工作是在随后的代码中进行的。在随后的代码中逐一对数组中的元素进行了赋值。随后对其进行了访问,并输出至控制台窗口中。
(4)数组的长度。若在创建方式1和创建方式2的代码末尾分别加入如下代码:
Console.WriteLine(a[5]);
Console.WriteLine(b[5]);
即访问了数组中不存在的一个元素,在编译时并不会出现错误。运行时,Visual Studio 2005将会提示出现异常,如图4-5所示。因此,使用数组时要注意数组的长度限制。
(5)数组的初始化。在对数组中的元素进行访问前,一定要对数组进行初始化。考虑如下的代码:
图4-5 运行结果
static void Main(string[] args)
{
int[] d;
d[0] = 1;
}
在编译该段代码时,Visual Studio 2005就会提示错误,如图4-6所示。
图4-6 运行结果