数组(一):认识数组
2012-05-09 23:48:01一、概述
数组的定义:
数组是由n(n≧1)个相同类型的数据元素组成的有限序列,数组中的每一个数据通常为数据元素 。
数组中的元素可以通过下标随机访问,其中下标的个数由组数的维数决定。
数组可以看作是线性表的推广,一维数组为按顺序存储的线性表,二维数组为数据元素类型为一维数组的线性表,三维数组为数据元素类型为二维数组的线性表,依此类推。
数组的特点:
数组中的数据元素数目确定。一旦定义了一个数组,其数据元素的数目不再增减;
数组中的数据元素具有相同的数据类型;
数组中的每个数据元素都和一组唯一的下标值对应;
数组是一种随机存储结构,可随机存取数组中的任意数据元素。
二、数组的操作
1.随机存,给定一组下标,修改相应数据元素中的值:SetValue(Object value,int index)
2.随机取,给定一组下标,获取对应数据元素的值:GetValue(int index)
3.获取数组元素的个数:Length{get;}
4.获取数组的秩(维数)Rank { get; }
5.将数组设置为零、false 或null,具体取决于元素类型:Clear(Array array, int index, int length)
6.从第一个元素开始复制数组中的一系列元素到另一数组中:Copy(Array sourceArray, Array destinationArray, int length)
7.将一维数组的所有元素复制到指定的一维数组Array中:CopyTo(Array array, int index)
8.获取数组指定维中的元素数:GetLength(int dimension)
9.对整个一维数组中的元素进行排序:Sort(Array array)
10.反转一维数组:Reverse(Array array)
11.数组指定维度的下限与上限:GetLowerBound(int dimension)和GetUpperBound(int dimension)
三、数组的顺序表示
对于一维数组,可根据数组元素的下标得到它的存储地址,也可根据下标来访问一维数组中的元素 。
对于多维数组,需要把多维的下标表达式转换成一维的下标表达式。这产生了两种存储方式:一种是以行序为主序(先行后列)的顺序存放,另一种是以列序为主序(先列后行)的顺序存放。
二维数组的两种存放方式示意图如下所示:
在C#中,数组实际上是对象。System.Array是所有数组类型的抽象基类型 ;所有数组都可以使用System.Array的属性和方法;当在程序中声明并创建了一个数组后,该数组就是一个Array类的实例,该类除了具有第二点数组的操作中提到的属性和方法外,还有很多其他的属性和方法,可以满足大部分开发的需要。本文就不再编写数组类的实现了,请参考Array.cs文件。
四、数组的声明
声明数组时,方括号 ([]) 必须跟在类型后面,而不是标识符后面。在 C# 中,将方括号放在标识符后是不合法的语法。C# 支持一维数组、多维数组(矩形数组)和数组的数组(交错的数组)。
一维数组:int[] arrayname;
多维数组:int[,] arrayname;
数组的数组:int[][] arrayname ;
声明数组并不实际创建它们。在 C# 中,数组是对象,必须进行实例化。如下实例
public static void Main()
{
//声明一个整型一维数组的引用,变且在堆中分配连续5个整型变量的空间。
int[] numbers = new int[5];
// 声明一个二维字符串数组的引用
string[,] names = new string[5, 4];
// 数组的数组,相当声明了包含5个byte型一维数组的引用变量的一维数组长度为5
byte[][] scores = new byte[5][];
//为每个btye型一维数组实例化
for (int i = 0; i < scores.Length; i++)
{
scores[i] = new byte[i + 3]; //非矩形的
}
for (int i = 0; i < scores.Length; i++)
{
Console.WriteLine("Length of row {0} is {1}", i, scores[i].Length);
}
}
五、数组的初始化
C# 通过将初始值括在大括号 ({}) 内为在声明时初始化数组提供了简单而直接了当的方法。下面的示例展示初始化不同类型的数组的各种方法。
1.一维数组
int[] numbers = new int[5] { 1, 2, 3, 4, 5 };
string[] names = new string[3] { "Matt", "Joanne", "Robert" };
//可省略数组的大小,如下所示:
int[] numbers = new int[] { 1, 2, 3, 4, 5 };
string[] names = new string[] { "Matt", "Joanne", "Robert" };
//如果提供了初始值设定项,则还可以省略 new 运算符,如下所示:
int[] numbers = { 1, 2, 3, 4, 5 };
string[] names = { "Matt", "Joanne", "Robert" };
2.多维数组
int[,] numbers = new int[3, 2] { { 1, 2 }, { 3, 4 }, { 5, 6 } };
string[,] siblings = new string[2, 2] { { "Mike", "Amy" }, { "Mary", "Albert" } };
//可省略数组的大小,如下所示:
int[,] numbers = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 } };
string[,] siblings = new string[,] { { "Mike", "Amy" }, { "Mary", "Albert" } };
//如果提供了初始值设定项,则还可以省略 new 运算符,如下所示:
int[,] numbers = { { 1, 2 }, { 3, 4 }, { 5, 6 } };
string[,] siblings = { { "Mike", "Amy" }, { "Mary", "Albert" } };
3.交错的数组
//可以像下例所示那样初始化交错的数组:
int[][] numbers = new int[2][] { new int[] { 2, 3, 4 }, new int[] { 5, 6, 7, 8, 9 } };
//可省略第一个数组的大小,如下所示:
int[][] numbers = new int[][] { new int[] { 2, 3, 4 }, new int[] { 5, 6, 7, 8, 9 } };
//-或-
int[][] numbers = { new int[] { 2, 3, 4 }, new int[] { 5, 6, 7, 8, 9 } };
六、数组的访问
访问数组成员可以直接进行,类似于在 C/C++ 中访问数组成员。例如,下面的代码创建一个名为 numbers 的数组,然后向该数组的第五个元素赋以 5:
int[] numbers = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
numbers[4] = 5;
//下面的代码声明一个多维数组,并向位于 [1, 1] 的成员赋以 5:
int[,] numbers = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 }, { 9, 10 } };
numbers[1, 1] = 5;
//下面声明一个一维交错数组,它包含两个元素。第一个元素是两个整数的数组,第二个元素是三个整数的数组:
int[][] numbers = new int[][] { new int[] { 1, 2 }, new int[] { 3, 4, 5 } };
//下面的语句向第一个数组的第一个元素赋以 58,向第二个数组的第二个元素赋以 667:
numbers[0][0] = 58;
numbers[1][1] = 667;
对数组使用 foreach:C# 还提供 foreach 语句。该语句提供一种简单、明了的方法来循环访问数组的元素。例如,下面的代码创建一个名为 numbers 的数组,并用 foreach 语句循环访问该数组:
int[] numbers = { 4, 5, 6, 1, 2, 3, -2, -1, 0 };
foreach (int i in numbers)
{
System.Console.WriteLine(i);
}
由于有了多维数组,可以使用相同方法来循环访问元素,例如:
int[,] numbers = new int[3, 2] { { 9, 99 }, { 3, 33 }, { 5, 55 } };
foreach (int i in numbers)
{
Console.Write("{0} ", i);
}
该示例的输出为:9 99 3 33 5 55