- Visual C# 2008開發技術詳解
- 李容等編著
- 836字
- 2018-12-27 11:19:42
第5章 數組處理
數組同上一章講的字符串一樣,也是C#數據處理方面的一個基礎內容。數組是一種基本的數據類型,和其他類型(比如int型、float型、double型、string型等)的區別是它能存儲一組數據,而非單個數據。這個性質使得數組的應用十分廣泛。
5.1 創建數組
同其他數據類型一樣,數組的創建也十分容易,示例代碼如下所示。
byte[] a = new byte[5];
上面的代碼是建立一個名為a,長度為5的byte型一維數組。如果要訪問該數組,用a[i]進行訪問,數組的元素索引應該從0開始。也就是說,要訪問數組的第一個元素用a[0],訪問最后一個用a[4]。數組的類型可以是C#中的任意基本類型,如int型、byte型、char型、double型、float型、string型等。下面舉個簡單的例子。
打開VS2008,在D:\C#\ch5目錄下建立一個名為arrayCreateTest的控制臺應用程序。在Main()函數里添加如下代碼。
int[] a1 = new int[10]; string[] a2 = new string[10]; for (int i = 0; i < 10; i++) { a1[i] = i; a2[i] = a1[i].ToString(); //轉化為string型從控制臺輸出 Console.Write(a2[i] + " "); } Console.ReadKey();
該段代碼實現的功能是先對一個整型數組賦值,然后將其轉化為string型從控制臺輸出。運行結果如圖5-1所示。

圖5-1 運行結果
在上例中對數組的定義是先給其分配內存空間,然后再進行賦值。也可以采用數組的另一種初始化方式,在定義的時候同時賦值,如下所示。
int[] s = new int[5] { 1, 2, 3, 4, 5 };
下面接著介紹二維數組及多維數組,先看一個簡單二維數組的定義。
double[, ] d = new double[2, 3];
二維數組的初始化和一維數組一樣,除了先聲明,后賦值外,也可以在聲明的同時進行賦值,如下所示。
double[, ] d = new double[, ] { {2,2}, {3,3}, {4,4}, {5,5}}; //聲明一個4行2 //列的二維數組并賦值
5.2 多維數組
在實際的數據處理中,三維數組就基本能處理所有問題。在此,舉一個三維數組的例子并說明foreach關鍵字在數組處理中的應用。
打開VS2008,在D:\C#\ch5目錄下建立一個名為mArrayTest的控制臺應用程序。在Main()函數中添加如下代碼。
int[, , ] s = new int[3, 3, 3]; for (int i = 0; i < 3; i++) //通過三個for循環對該三維數組進行賦值 { for (int j = 0; j < 3; j++) { for (int m = 0; m < 3; m++) { s[i, j, m] = i + j + m; } } } foreach (int k in s) //用foreach輸出數組中的所有元素到控制臺顯示 { Console.Write(k.ToString()+" "); } Console.ReadKey();
運行結果如圖5-2所示。

圖5-2 運行結果
上例中,對聲明的三維數組進行初始化,并運用foreach關鍵字將三維數組中的全部元素輸出到控制臺。介紹完一維數組和多維數組后,下面接著介紹數組中的一個靈活點——動態數組。
5.3 動態數組
在數組的使用過程中,讀者有時候希望數組的長度和元素都能隨著程序的運行不斷改變。但改變一次就重新開辟一個新的數組對象將會十分占用內存。所以,前面所講的數組都不能滿足要求。有解決方案嗎?當然有!這正是動態數組要解決的問題。.NET Framework中提供了一個ArrayList類,專門用于處理可按動態增減成員的數組。ArrayList類包含在System.Collections命名空間中,相關屬性和方法如表5-1所示。
表5-1 ArrayList類的相關屬性和方法

5.3.1 創建簡單的動態數組
了解了ArrayList類屬性和方法后,下面以一個例子說明以上的某些方法,幫助讀者掌握ArrayList類的運用。
打開VS2008,在D:\C#\ch5目錄下建立名為ArraylistTest的控制臺應用程序,步驟如下。
(1)在命名空間中包含System.Collections,因為ArrayList類包含在該命名空間內。
(2)在Main()函數中添加如下代碼。
ArrayList al = new ArrayList(); al.Add(0.05f); //向ArrayList結尾處添加4種不同類型的對象 al.Add("sss"); al.Add(' s' ); al.Add(3); Console.WriteLine("當前ArrayList里的全部元素如下:"); for (int i = 0; i < 4; i++) { Console.Write(al[i]+" "); } Console.WriteLine("\n當前ArrayList里的元素個數共有:"); Console.Write(al.Count); //獲取ArrayList中的元素個數 Console.WriteLine("\n繼續添加后當前ArrayList里的全部元素如下:"); al.Insert(1, "aa"); //在ArrayList索引值為1處添加字符串aa for (int i = 0; i < 5; i++) { Console.Write(al[i]+" "); } Console.WriteLine("\n倒序后當前ArrayList里的全部元素如下:"); al.Reverse(); //將ArrayList中的所有元素逆轉排序 for (int i = 0; i < 5; i++) { Console.Write(al[i]+" "); } Console.WriteLine("\n刪除后當前ArrayList里的全部元素如下:"); al.RemoveAt(2); for (int i = 0; i < 3; i++) { Console.Write(al[i] + " "); } Console.ReadKey();
程序運行結果如圖5-3所示。

圖5-3 運行結果
通過該例子,可以看出ArrayList具有以下優勢。
(1)ArrayList中能夠同時存儲不同類型的數據,比如第一個元素是int型,第二個可以是string型,這是常規數組辦不到的。
(2)ArrayList能夠隨時添加或刪除元素,而不需開辟新的數組對象,并且代碼很簡單,也不需復雜的類型轉化。
(3)能夠隨時在ArrayList的任意位置插入數據。
5.3.2 動態數組的排序
下面再看一個例子,產生一個int數組,長度為50,并向其中隨機插入1~50之間的任意整數,并且不能重復,然后完成排序。對于這個例子,用ArrayList實現起來非常方便。
打開VS2008,在D:\C#\ch5目錄下建立名為ArraylistTest2的控制臺應用程序。打開工程,在Main()函數中添加如下代碼。
int[] intArr = new int[50]; //創建數組 ArrayList myList = new ArrayList(); //創建ArrayList Random rnd = new Random(); //創建隨機數類 while (myList.Count < 50) { int num = rnd.Next(1, 51); //生成1~50之間的任意整數 if (! myList.Contains(num)) myList.Add(num); //向ArrayList添加元素 } Console.WriteLine("隨機插入后的數組:"); for (int i = 0; i < 50; i++) { intArr[i] = (int)myList[i]; Console.Write("{0} ", intArr[i]); } //冒泡法排序 for (int j = intArr.Length -1; j >= 0; j--) { for (int k = 0; k < j; k++) { int m = 0; if (intArr[k] < intArr[k + 1]) { m = intArr[k]; intArr[k] = intArr[k + 1]; intArr[k + 1] = m; } } } Console.WriteLine(); Console.WriteLine("排序后的數組:"); //輸出排序結果 for (int i = 0; i < 50; i++) { Console.Write("{0} ", intArr[i]); } Console.ReadKey();
運行結果如圖5-4所示。

圖5-4 運行結果
5.4 數組的特殊操作
本節主要介紹兩個字符串的特殊操作,一是將數組作為參數傳遞,二是數組的數組,下面將通過例子進行詳細說明。
5.4.1 作為參數傳遞的數組
數組是一種引用類型,它能作為參數傳遞給函數調用。下面兩節將按不同維數的數組分別進行舉例介紹。
5.4.2 將一維數組作為參數傳遞
打開VS2008,在D:\C#\ch5目錄下建立名為ArrayParaTest的控制臺應用程序,在Program.cs中添加Array()函數,代碼如下。
private static void Array(int[] s) { for (int i = 0; i < s.Length; i++) { Console.Write(s[i].ToString()+" "); } }
然后在Main()函數中添加如下代碼。
int[] ss = new int[6] { 1, 2, 3, 4, 5, 6 }; Array(ss); Console.ReadKey();
運行結果如圖5-5所示。

圖5-5 運行結果
本例中,將數組s作為Array()函數的參數進行傳遞,在Main()函數中被賦值,將所有元素輸出到控制臺顯示。
5.4.3 將多維數組作為參數傳遞
打開VS2008,在D:\C#\ch5目錄下建立名為ArrayParaTest2的控制臺應用程序。在Program.cs中添加mArray()函數,代碼如下所示。
private static void mArray(int[, , ] ss) { foreach (int s in ss) { Console.Write(s.ToString()+" "); } }
然后在Main()函數中添加如下代碼。
int[, , ] sss = new int[3, 3, 3]; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { for (int m = 0; m < 3; m++) { sss[i, j, m] = i + j + m; } } } mArray(sss); Console.ReadKey();
運行結果如圖5-6所示。
將多維數組作為參數傳遞與一維數組幾乎沒有什么區別。只是對多維數組元素的訪問時要麻煩一些。

圖5-6 運行結果
5.4.4 數組的數組
顧名思義,數組的數組意思是某數組的元素也是數組,也可以稱作“復合”數組。它的特點是數組長度在數組聲明的時候可以不被指定,先來看下面的一個例子。
string[][] s = new string[4][]; //定義一個二維數組 s[0] = new string[] { "a", "a", "a" }; s[1] = new string[] { "b", "b", "b", "b"}; s[2] = new string[] { "c", "c", "c", "c", "c" }; s[3] = new string[] { "d", "d", "d", "d", "d", "d" };
到這里,可能有讀者會問,對這樣的數組進行訪問和以前的數組有區別嗎?答案是肯定的。比如想輸出數組s里面的所有元素,如果直接采用下面的代碼。
foreach (string ss in s) { Console.Write(ss + " "); }
會出現如下錯誤信息。
錯誤1 無法將類型“string[]”轉換為“string”
為什么會這樣呢?因為數組s中包含的元素是string[]型,而非string型,所以正確的做法應該如下面代碼所示。
foreach (string[]ss in s) { foreach (string sss in ss) { Console.Write(sss + " "); } }
先遍歷訪問每個子數組,再將子數組里的元素循環輸出到控制臺。數組的數組并不常用,但在某些特殊場合還是比較有用的,它能節省程序運行的時間。
5.5 小結
本章主要介紹了一維數組和多維數組的創建及基本的使用方法,包括數組中元素的訪問和遍歷輸出。重點說明了動態數組類ArrayList的屬性、方法和用法,以一個例子涵蓋了大多數ArrayList的常見操作。最后,還介紹了作為參數傳遞的數組和數組的數組??傊?,數組是繼字符串后C#的又一個應用廣泛的數據處理類型,在很多場合都能用到。