第2章 Arrays與ArrayLists
數組是最常見的數據結構,出現在幾乎所有的編程語言中。在C#中使用數據本質上是創建了一個System.Array類型的數組對象。System.Array類是所有數組的抽象基類型,它提供了一系列的方法用於完成如排序與查找之類在過去程序員不得不手工實現的任務。
C#中數組的一個有趣的替代者是ArrayList類。ArrayList是一個可以根據需要自動增加存儲空間的數組。針對你不能准確的決定數組的最終大小或數組的大小在程序的生命周期中會改變很多次的情況,arraylist是一個比array更好的選擇。
在本章中,我們將快速浏覽C#中數組的基本使用,然後我們將轉向更高級的話題,包括對ArrayList類對象的拷貝,克隆,測驗質量及使用它們的靜態方法。
數組基礎
數組是基於索引的集合數據。數組既可以是內置類型也可以是用戶自定義類型。事實上,把數組中數據看成是對象可能是最簡單的。C#中的數據本身也是對象,因為它們繼承自System.Array類。既然數組是System.Array類的實例,使用數組時你可以使用System.Array類的方法與屬性。
聲明與初始化數組
數組使用下面的語法聲明:
type[] array-name;
type是數組元素的數據類型,例如:
string[] names;
第二行是必需的,其用來初始化數組(因為其是System.Array類型的對象)並決定數組的大小,下面代碼初始化了剛聲明的names數組:
names = new string[10];
並預留了10個字符串的內存空間。
在需要的時候你可以像下面這樣將兩個語句合並為一行:
string[] names = new string[10];
有時候你想將聲明,初始化,賦值數組的操作放在一個語句中,在C#中,你可以通過初始化列表來完成。
int[] numbers = new int[] { 1, 2, 3, 4, 5 };
這個數字的列表,稱作初始化列表,其放於一對花括號之間,元素之間以逗號分隔。當使用這種技術聲明一個數組時,你不需要指定元素的數目,編譯器由初始化列表的項目的數目來推斷這個數值。
設置與訪問數組元素
存儲於數組的元素既可以直接訪問也可以調用Array類的SetValue方法。直接訪問通過賦值語句中左邊的索引關聯指定位置的數組元素。
names[2] = "Raymond";
sales[19] = 23123;
SetValue方法提供了一個更面向對象的方式設置數組元素的值,此方法接受兩個參數,一個索引值及一個元素值。
names.SetValue("Raymond", 2);
sales.SetValue(23123, 19);
數組元素既可通過索引直接訪問也可以通過GetValue方法訪問。GetValue方法接受單一參數 - 一個索引值。
myName = names[2];
monthSales = (int)sales.GetValue(19);
使用一個for循環遍歷一個數組的元素是很常見的。程序員在編寫循環語句時常犯的一個錯誤有兩個,其一是硬編碼循環的上限值(這是一個錯誤,因為如果數組是動態的,他的上界會改變)。另一個錯誤是調用一個函數訪問每一次循環的迭代循環的上界。
for (int i = 0; i <= sales.GetUpperBound(0); i++)
totalSales = totalSales + sales[i];
檢索數組元數據的方法及屬性
Array類提供了幾個屬性用於檢查一個數組的元數據。
Length屬性用來統計多維數組元素的個數,其返回那個數組中准確的元素數目。另外,你也可以使用GetUpperBound方法得到的值加上1得到數組元素數。
Length返回數組元素的總數目,GetLength方法統計數組中單個維度的元素數目。這個方法與Rank屬性一起使用,可以用來在運行時沒有丟失數據的風險下調整數組的大小,這項技術將在本章後面部分討論。
GetType方法用來在你不確定數組類型的情況下明確數組的數據類型,如將數組作為參數傳給一個方法時。在下面的代碼片段中,我們創建了Type類型的變量,可以使用其IsArray方法判斷對象是否為一數組。如果對象是數組,代碼返回數組的數據類型。
int[] numbers;
numbers = new int[] { 0, 1, 2, 3, 4, };
Type arrayType = numbers.GetType();
if (arrayType.IsArray)
Console.WriteLine("The array type is: {0}", arrayType);
else
Console.WriteLine("Not an array");
Console.Read();
GetType方法不僅返回數組的類型,同時讓我們知道對象本質是一個數組。如下是上述代碼的輸出:
The array type is: System.Int32[]
方括號指示了對象是一個數組。同樣注意在顯示數據類型時使用的格式。我們不得不這樣做,因為我們不能將Type數據轉型為string以便連接在待顯示字符串的尾部。
多維數組
到目前我們只討論了一位數組。在C#中,數組可以多達32維,雖然超過三維的數組很少見(且令人迷惑)。
聲明多維數組是通過指定數組每個維度的上界,二維數組聲明:
int[,] grades = new int[4, 5];
聲明了一個由4行5列元素組成的數組。二維數組常用作建模矩陣,你也可以聲明一個多維數組而不指定維度的界。完成這樣的工作,你可以使用逗號指定維度數。例如:
double[,] Sales;
聲明了一個二維數組,反之:
double[, ,] sales;
聲明了一個三維數組。當你在不提供維度的上界的情況下聲明數組後,你需要在稍後重新使用界值定義數組:
Sales = new double[4, 5];
多維數組可以使用初始化列表完成初