当程序运行时很难预料会创建多少个对象,用定长数组存储数量不定的对象,效率太低。System.Collections命名空间定义了多种可选群集类,用来存储对象。注意,System.Array类不是System.Collections命名空间的一部分;不过,所有的C#群集类——System.Array和各种System.Collections类——都实现了ICollection接口,该接口在System.Collection命名空间中定义,所以,所有的群集类都共享一系列公共行为。
数组
System.Array类定义了一系列有用的方法和属性来搜索、排序和修改数组,以下面的代码演示如何用Length来求的一维数组的长度:
int[] x= new int[20];
//数组具体初始化过程已经从略.....
//遍历数组。
//在i等于x.length之前结束!!!
for(int i=0;i<x.length;i++)
{
Console.WriteLine(x[i]);
}
数组从零开始计数,因此,在for循环中,必须在达到长度上线之前停止。
注意,数组的长度不反映数组中有多少个元素被赋了值,从技术上说,即便没有明确地在数组中存储任何东西,每个元素都会自动填充该数组类型中等价于零的值。因此,数组的长度仅仅表明了整个数组的容量;它的容量在一开始声明后就被固定了,以后也再不能更改(要该就要修改声明时的大小)。
数组的方法
Array类定义了很多有用的静态方法和实体方法,可以用来检查或操作数组;接下来我们将讨论几个常用的方法。关于Array类方法的完整描述请参阅MSDN.
前三个方法是静态的,意味着它们必须从作为一个整体的Array类上调用:
1、public static void Clear(Array array,int startIndex,int length):
将数组指定范围内的元素重设为与零等价的值。参数包括要清零的数组的名称,开始位置(从0开始计数)和需要清零的元素数目;
int[] x = new int[5];
//清空整个数组。
Array.Clear(x,0,x.length);
2、public static void Reverse(Array array): 调转一个一维数组中的所有元素的次序;
int[] x = {1,2,3};
Array.Reverse(x); //现在x中的元素包括:{3,2,1}.
该方法还有一个覆盖版本,能调转从起始位置开始的规定长度的元素次序:
public static void Reverse(Array array,int startIndex,int length)
3、public static void Sort(Array array):对一维数组中的元素进行排序。对字符串默认的排序规则是按字母表次序,对数字则按从小到大排序。
string[] names = {"Vijay","Tiger","Phil"};
Array.Sort(names); //元素的次序变成了"Phil","Tiger","Vijay".
该方法有一个覆载版本,能对从起始位置开始规定长度内的元素进行排序:
public static void Sort(Array array,int indexStart,int length)
接下来的三个方法是实体方法,意味着它们能经由不同的数组实体直接被调用:
1、public object GetValue(int index) :以一般对象的形式返回一维数组中指定位置的元素。如果我们确知返回对象的类型,就能转换它:
String[] names = {"Chirs","Sandi","Brennan"};
//将返回对象转换为字符串。
string name = (string)names.GetValue(0);
或:
int[] numbers = {11,44,54};
//将返回对象转换为整数。
string number = (int)numbers.GetValue(0);
该方法也有重载版本,能够返回二维或者三维数组中的元素:
public object GetValue(int index1,int index2)
public object GetValue(int index1,int index2,int index3)
2、public void SetValue(object value,int index):修改一维数组中指定位置上的元素。
该方法还有修改二维或三维数组中指定元素值的重载版本:
public void SetValue(object value,int index1,int index2)
public void SetValue(object value,int index1,int index2,int index3)
虽然GetValue和SetValue是Array类提供的方法,但索引器的概念容易和便于使用。
语法:
string name = names[0];
比下面等同的语法更容易编写和理解
string name = (string)names.GetValue(0);
3、public int GetLength(int dimension):返回任意维数组中指定维度的长度。
例如,要得到一个二维数组中第一维的长度,用GetLength(0)。(对于一维数组,只需要Length属性来判断数组的长度)
GetUpperBound可以获取数组的最高下标。
GetLowerBound可以获取数组的最低下标。
这样就可以实现对数组的遍历
//定义二维数组
string[,] arrData = new string[,]{{"1","2"},{"22","22"},{"33","33"}};
for(int i=arrData.GetLowerBound(0);i<=arrData.GetUpperBound(0);i++)
{
for(int i=arrData.GetLowerBound(1);i<=arrData.GetUpperBound(1);i++)
{
//处理每一个元素}}0表示二维数组的第一维,1表示数组的第二维
}
}