解析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表示用於比較的類 。示例代碼如下:

發佈了38 篇原創文章 · 獲贊 9 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章