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

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

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

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

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

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

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

圖5-6 運行結(jié)果
5.4.4 數(shù)組的數(shù)組
顧名思義,數(shù)組的數(shù)組意思是某數(shù)組的元素也是數(shù)組,也可以稱作“復(fù)合”數(shù)組。它的特點是數(shù)組長度在數(shù)組聲明的時候可以不被指定,先來看下面的一個例子。
string[][] s = new string[4][]; //定義一個二維數(shù)組 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" };
到這里,可能有讀者會問,對這樣的數(shù)組進行訪問和以前的數(shù)組有區(qū)別嗎?答案是肯定的。比如想輸出數(shù)組s里面的所有元素,如果直接采用下面的代碼。
foreach (string ss in s) { Console.Write(ss + " "); }
會出現(xiàn)如下錯誤信息。
錯誤1 無法將類型“string[]”轉(zhuǎn)換為“string”
為什么會這樣呢?因為數(shù)組s中包含的元素是string[]型,而非string型,所以正確的做法應(yīng)該如下面代碼所示。
foreach (string[]ss in s) { foreach (string sss in ss) { Console.Write(sss + " "); } }
先遍歷訪問每個子數(shù)組,再將子數(shù)組里的元素循環(huán)輸出到控制臺。數(shù)組的數(shù)組并不常用,但在某些特殊場合還是比較有用的,它能節(jié)省程序運行的時間。
5.5 小結(jié)
本章主要介紹了一維數(shù)組和多維數(shù)組的創(chuàng)建及基本的使用方法,包括數(shù)組中元素的訪問和遍歷輸出。重點說明了動態(tài)數(shù)組類ArrayList的屬性、方法和用法,以一個例子涵蓋了大多數(shù)ArrayList的常見操作。最后,還介紹了作為參數(shù)傳遞的數(shù)組和數(shù)組的數(shù)組。總之,數(shù)組是繼字符串后C#的又一個應(yīng)用廣泛的數(shù)據(jù)處理類型,在很多場合都能用到。
- 精通MATLAB神經(jīng)網(wǎng)絡(luò)
- 人工智能超越人類
- 協(xié)作機器人技術(shù)及應(yīng)用
- Photoshop CS3特效處理融會貫通
- PyTorch Deep Learning Hands-On
- 工業(yè)機器人操作與編程
- 基于Xilinx ISE的FPAG/CPLD設(shè)計與應(yīng)用
- RedHat Linux用戶基礎(chǔ)
- Linux系統(tǒng)管理員工具集
- 智能制造系統(tǒng)及關(guān)鍵使能技術(shù)
- 計算機組裝與維修實訓(xùn)
- 中文版Photoshop情境實訓(xùn)教程
- 菜鳥起飛五筆打字高手
- Oracle 11g基礎(chǔ)與提高
- 單片機原理、應(yīng)用與仿真