Array类提供创建、操作、搜索和排序数组的方法,因而在公共语言运行库中用作所有数组的基类。
一个元素是Array中的一个值。Array的长度是它可包含的元素总数。Array的秩是array中的维数。Array中维度的下限是array中该维度的起始索引,多维array的各维度可以有不同的界限。
在声明数组时用的的方括号[]是C#中使用Array类的记号。在后台,会创建一个派生于抽象基类Array的新类(why? 因为Array类是支持数组的语言实现的基类。只有系统和编译器能够从Array类显示派生。用户应当使用由语言提供的数组构造。)。此时就可以使用Array类为每个C#数组定义的方法和属性了。如:数组中使用的Length属性,foreach语句的使用(其实是使用了Array类中的GetEnumerator()方法)。
Array的常用属性:
Length返回数组元素个数,如果需要返回一维中元素个数可使用GetLength()方法;LongLength若数组包含的元素个数超过了32位int值的取值范围,则使用longlength来获取元素个数;Rank获取数组的维数。
创建Array数组:
由于Array类是抽象类,故不能使用构造函数来创建数组。但可以使用Array类的静态方法GreateInstance()来创建数组。如:
Array intArray1=Array.CreateInstance(typeof(int),5)//创建int类型,5个元素的数组
For(int i=0;i<5;i++)
{intArray1.SetValue(33,i);}//使用SetValue()设置值
For(int i=0;i<5;i++)
{Console.WriteLine(intArray1.GetValue(i));}//使用GetValue()读取值
强制转换为int[]数组:int[] intArray2=(int[])intArray1;
CreateInstance()可以创建多维数组和不基于0的数组。如2*3的二维数组:
Int[] lengths={2,3};//要创建的Array中每个维的大小
Int[] lowerBounds={1,10};
//要创建的Array中每个维度的下限(起始索引,第一维从1开始,第二维从10开始)
Array racers=Array.CreateInstance(typeof(Person),lengths,lowerBounds);//Person为自定义类。
赋值:
Racers.SetValue(new Person(“F1”,”L1”),1,10);
Racers.SetValue(new Person(“F2”,”L2”),1,11);
…
读取值,尽管数组布什基于0的,但可以用一般的C#记号将它赋予一个变量,如:
Person[,] racers2=(Person[,])racers;
Person first=racers2[1,10];
Person last=racers2[2,12];
复制数组:
因为数组是引用类型,所有将一个数组变量赋予另一个数组变量,会得到两个只向同一个数组的变量。而复制数组,会使数组实现ICloneable接口。此接口定义的Clone()方法会创建数组的浅副本,仅复制Array的元素(无论它们是引用类型还是值类型),但不复制这些引用所引用的对象。
如果数组元素是值类型,则会复制所有的值。
如果数组包含引用类型,则不复制对象元素,而只复制对象引用。引用还是引用同一个对象。
也可以使用Array.Copy()方法创建浅副本。区别:Clone方法会创建一个新数组,Copy方法是将一个Array的一部分元素复制到另一个Array中,即把一个array传送给了阶数相同、有足够元素空间的已有Array。
如果需要包含引用类型的数组的深副本,就必须迭代数组,创建新对象。
排序
Array类实现了对数组中元素的冒泡排序。Sort()方法需要数组中的元素实现IComparable接口。简单类型,如System.String和System.Int32实现了IComparable接口,所以可以对包含这些类型的元素排序。
如果对使用定制类作为元素的数组,就必须实现IComparable接口。这个接口只定义了一个方法CompareTo(),如果要比较的对象相等,则返回0。如果实例应排在参数对象的前面,则返回小于0的值。如果实例应排在参数对象的后面,则返回大于0的值。
要使用Array.Sort(persons);//persons为Person类数组,则必须继承IComparable接口,且必须改写Person类,添加CompareTo()方法。示例代码如下:
如果不用改写Person类就可以完成排序该怎么做?
Array.Sort()方法提供了一个重载,即Array.Sort (Array, IComparer),其中Array为要排序的数组,IComparer为比较元素时要使用的IComparer实现。ICompare接口定义了方法Compare()。IComparable接口必须由要比较的类(Array元素的类型)来执行,而IComparer接口 独立于要比较的类(不用更改类代码)。这就是Compare()方法定义了两个要比较的变元的原因。Compare方法的返回值与IComparable接口的CompareTo方法的返回值类似。具体作法可以另外定义一个用于比较的类它继承自IComparer接口并实现接口的Compare方法,排序时只要调用Array.Sort (Array, IComparer)方法即可,此时array表示要排序的数组,IComparer表示用于比较的类 。示例代码如下: