解析Array类

 Array类提供创建、操作、搜索和排序数组的方法,因而在公共语言运行库中用作所有数组的基类。

一个元素是Array中的一个值。Array的长度是它可包含的元素总数。Array的秩是array中的维数。Array中维度的下限是array中该维度的起始索引,多维array的各维度可以有不同的界限。

在声明数组时用的的方括号[]C#中使用Array类的记号。在后台,会创建一个派生于抽象基类Array的新类(why? 因为Array类是支持数组的语言实现的基类。只有系统和编译器能够从Array类显示派生。用户应当使用由语言提供的数组构造。)。此时就可以使用Array类为每个C#数组定义的方法和属性了。如:数组中使用的Length属性,foreach语句的使用(其实是使用了Array类中的GetEnumerator()方法)。

Array的常用属性:

Length返回数组元素个数,如果需要返回一维中元素个数可使用GetLength()方法;LongLength若数组包含的元素个数超过了32int值的取值范围,则使用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.StringSystem.Int32实现了IComparable接口,所以可以对包含这些类型的元素排序。

如果对使用定制类作为元素的数组,就必须实现IComparable接口。这个接口只定义了一个方法CompareTo(),如果要比较的对象相等,则返回0。如果实例应排在参数对象的前面,则返回小于0的值。如果实例应排在参数对象的后面,则返回大于0的值。

要使用Array.Sort(persons);//personsPerson类数组,则必须继承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表示用于比较的类 。示例代码如下:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值