C#程序設(shè)計(jì)45泛型和集合課件_第1頁
C#程序設(shè)計(jì)45泛型和集合課件_第2頁
C#程序設(shè)計(jì)45泛型和集合課件_第3頁
C#程序設(shè)計(jì)45泛型和集合課件_第4頁
C#程序設(shè)計(jì)45泛型和集合課件_第5頁
已閱讀5頁,還剩27頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、單元4 C#進(jìn)階編程 單元4 C#進(jìn)階編程 知識(shí)目標(biāo) (1)掌握結(jié)構(gòu)化的異常處理機(jī)制;(2)深刻理解委托和事件;(3)掌握枚舉和結(jié)構(gòu);(4)掌握字符串的常用方法;(5)掌握正則表達(dá)式的基本用法;(6)掌握常用的集合類和泛型集合類。知識(shí)目標(biāo) (1)掌握結(jié)構(gòu)化的異常處理機(jī)制;能力目標(biāo)(1)能夠捕獲并處理異常;(2)能使用枚舉或結(jié)構(gòu)描述數(shù)據(jù);(3)能對(duì)文本進(jìn)行較為復(fù)雜的處理;(4)能使用正則表達(dá)式實(shí)現(xiàn)文本的驗(yàn)證;(5)能定義和使用委托類型;(6)能給對(duì)象添加事件并能處理事件;(7)能使用集合類存儲(chǔ)數(shù)據(jù),能編寫基于棧、隊(duì)列、鏈表、哈希表等數(shù)據(jù)結(jié)構(gòu)的程序。能力目標(biāo)(1)能夠捕獲并處理異常;教學(xué)任務(wù)任務(wù)1

2、 異常處理任務(wù)2 枚舉和結(jié)構(gòu)任務(wù)3 委托和事件任務(wù)4 字符串與正則表達(dá)式任務(wù)5 泛型和集合教學(xué)任務(wù)任務(wù)1 異常處理單元4 C#進(jìn)階編程任務(wù)5 泛型和集合單元4 C#進(jìn)階編程任務(wù)5 泛型和集合引例實(shí)現(xiàn)簡單迷宮。尋找一條從入口到出口的通路。引例實(shí)現(xiàn)簡單迷宮。尋找一條從入口到出口的通路。知識(shí)儲(chǔ)備知識(shí)點(diǎn)1:非泛型集合。知識(shí)點(diǎn)2:泛型概述。知識(shí)點(diǎn)3:泛型集合。知識(shí)儲(chǔ)備知識(shí)點(diǎn)1:非泛型集合。集合概述如果對(duì)象可以提供對(duì)相關(guān)對(duì)象的引用,那么它就是一個(gè)集合 ,它可以遍歷集合中的每個(gè)數(shù)據(jù)項(xiàng);專業(yè)的說法是所有實(shí)現(xiàn)了System.Collections.IEnumerable接口的類的對(duì)象都是集合。 數(shù)據(jù)集合類都位于

3、System.Collections命名空間中。集合概述如果對(duì)象可以提供對(duì)相關(guān)對(duì)象的引用,那么它就是一個(gè)集合知識(shí)點(diǎn)1:非泛型集合常用集合類型1. ArrayList類2. Stack類3.Queue類4.Hashtable類知識(shí)點(diǎn)1:非泛型集合常用集合類型集合優(yōu)點(diǎn)數(shù)組Array是固定大小的,不能伸縮;而集合卻是可變長的。數(shù)組要聲明元素的類型,集合類的元素類型卻是object。數(shù)組可讀可寫不能聲明只讀數(shù)組。集合類可以提供ReadOnly方法以只讀方式使用集合。集合優(yōu)點(diǎn)數(shù)組Array是固定大小的,不能伸縮;而集合卻是可變集合屬性修改或者獲取ArrayList的容量使用Capacity屬性,通過設(shè)置

4、該屬性的值可以修改ArrayList的容量;讀取該屬性的值可以獲取ArrayList的容量當(dāng)為ArrayList對(duì)象添加的數(shù)據(jù)元素的個(gè)數(shù)超出初始化時(shí)指定的數(shù)據(jù)項(xiàng)個(gè)數(shù)時(shí),ArrayList對(duì)象的容量還可以自動(dòng)增長默認(rèn)增長后的容量為原來的2倍,即數(shù)據(jù)項(xiàng)的個(gè)數(shù)為初始化時(shí)的2倍。集合屬性修改或者獲取ArrayList的容量ArrayList常用的屬性和方法如下表所示屬性說明Capacity獲取或設(shè)置集合可包含的元素?cái)?shù)Count獲取集合中實(shí)際包含的元素?cái)?shù)方法說明Add將元素添加到集合的結(jié)尾處Clear從集合中移除所有元素CopyTo將ArrayList或它的一部分復(fù)制到一維數(shù)組中Insert將元素插入到

5、集合的指定索引處Remove從集合中移除特定值的第一個(gè)匹配項(xiàng)RemoveAt移除集合中指定索引處的元素Reverse將集合中元素的順序反轉(zhuǎn)Sort將集合或集合的一部分進(jìn)行排序ArrayList常用的屬性和方法如下表所示屬性說明Capa【例4-7】歌唱比賽計(jì)分器。從鍵盤輸入評(píng)委打出的分?jǐn)?shù),去掉一個(gè)最高分和一個(gè)最低分,顯示平均分。 class Score ArrayList al = new ArrayList(); public void AddMark() int i = 0; while (true) Console.WriteLine(請輸入評(píng)為分?jǐn)?shù),以-1結(jié)束); i = int.Par

6、se(Console.ReadLine(); if (i != -1) al.Add(i); else break; public void Del() if (al.Count 2) al.Sort(); al.RemoveAt(0); al.RemoveAt(al.Count - 1); public double Average() double sum = 0; foreach (int i in al) sum += i; return sum / al.Count; class Program static void Main(string args) Score s = new

7、Score(); s.AddMark(); s.Del(); Console.WriteLine(平均分是0, s.Average(); Console.ReadKey(); 【例4-7】歌唱比賽計(jì)分器。從鍵盤輸入評(píng)委打出的分?jǐn)?shù),去掉一Queue類Queue是先進(jìn)先出的集合類,也成為隊(duì)列。隊(duì)列的特性是一端進(jìn),一端出,即先進(jìn)入隊(duì)列的元素將會(huì)先從出口出來。隊(duì)列一般有入隊(duì)和出隊(duì)的操作,隊(duì)列,先進(jìn)先出。Enqueue方法入隊(duì)列,Dequeue方法出隊(duì)列。 class Program static void Main(string args) Queue q = new Queue(); Console

8、.WriteLine(入隊(duì)前,隊(duì)列的大小0, q.Count); q.Enqueue(0001); q.Enqueue(洗發(fā)水); q.Enqueue(15); Console.WriteLine(入隊(duì)后,隊(duì)列的大小0, q.Count); q.Dequeue(); Console.WriteLine(出對(duì)后,隊(duì)列的大小0, q.Count); foreach (object item in q) Console.WriteLine(隊(duì)列中的元素0, item); Console.ReadKey(); Queue類Queue是先進(jìn)先出的集合類,也成為隊(duì)列。隊(duì)列的Stack類棧,后進(jìn)先出。Pus

9、h方法入棧,Pop方法出棧。Stack是又一重要的集合類,它的功能與Queue相似,但也有不同。它的特點(diǎn)是后進(jìn)先出,即最后進(jìn)入的元素會(huì)最先出來。堆棧一般有進(jìn)棧和出棧的操作。Stack類棧,后進(jìn)先出。Push方法入棧,Pop方法出棧。【例4-8】實(shí)現(xiàn)數(shù)值進(jìn)制的轉(zhuǎn)換。 class Program static string Convert(int i, int j) if (i 16) return 只能將十進(jìn)制轉(zhuǎn)化為二到十六進(jìn)制; Stack stack = new Stack(); do int k = i % j; char c = (k 0) s += stack.Pop().ToStri

10、ng(); return s; static void Main(string args) Console.WriteLine(請輸入一個(gè)十進(jìn)制數(shù):); int i = int.Parse(Console.ReadLine(); Console.WriteLine(請輸入要轉(zhuǎn)換的進(jìn)制:); int j = int.Parse(Console.ReadLine(); Console.WriteLine(Convert(i, j); Console.ReadKey(); 【例4-8】實(shí)現(xiàn)數(shù)值進(jìn)制的轉(zhuǎn)換。 class ProgramHashTable類HashTable翻譯為哈希表,表示鍵(key)

11、/值(value)對(duì)的集合,這些鍵/值對(duì)根據(jù)鍵的哈希代碼進(jìn)行組織,每一個(gè)元素都是一個(gè)存儲(chǔ)在字典實(shí)體對(duì)象中的鍵/值對(duì)。HashTable像一個(gè)字典,根據(jù)鍵可以找到相應(yīng)的值。哈希表提供了添加元素和訪問元素等方法,哈希表,名-值對(duì)。 class Program static void Main(string args) Hashtable h = new Hashtable(3); h.Add(1, 0001); h.Add(2, 洗發(fā)水); h.Add(decimal, 15); foreach (DictionaryEntry item in h) Console.WriteLine(0 1,

12、item.Key, item.Value); h.Remove(decimal); Console.WriteLine(n刪除后的哈希表); foreach (DictionaryEntry item in h) Console.WriteLine(0 1, item.Key, item.Value); Console.ReadKey(); HashTable類HashTable翻譯為哈希表,表示鍵(知識(shí)點(diǎn)2:泛型概述所謂泛型,即通過參數(shù)化類型來實(shí)現(xiàn)在同一份代碼上操作多種數(shù)據(jù)類型,泛型編程是一種編程范式,它利用“參數(shù)化類型”將類型抽象化,從而實(shí)現(xiàn)更為靈活的復(fù)用。C#泛型賦予了代碼更強(qiáng)的類型安全

13、,更好的復(fù)用,更高的效率,更清晰的約束。 知識(shí)點(diǎn)2:泛型概述所謂泛型,即通過參數(shù)化類型來實(shí)現(xiàn)在同一份代泛型泛型,是指定類型的集合,是通過參數(shù)化類型來實(shí)現(xiàn)在同一份代碼上操作多種數(shù)據(jù)的類型。泛型是在C#2.0引入的。泛型的字面意思是具有在多種數(shù)據(jù)類型上皆可操作,與模板有些相似。泛型引入了類型參數(shù)化的概念,能夠?qū)崿F(xiàn)定義的泛型類和方法將一個(gè)或多個(gè)類型的指定,推遲到客戶端代碼聲明并實(shí)例化該類或方法的時(shí)候。在編寫其他客戶端代碼時(shí)使用的單個(gè)類,不會(huì)引入運(yùn)行時(shí)強(qiáng)制轉(zhuǎn)換或裝箱操作的成本或風(fēng)險(xiǎn)。只要提供數(shù)據(jù)類型就能使用這些強(qiáng)有力的數(shù)據(jù)結(jié)構(gòu)。泛型泛型,是指定類型的集合,是通過參數(shù)化類型來實(shí)現(xiàn)在同一份代泛型的特點(diǎn)如果

14、實(shí)例化泛型類型的參數(shù)相同,那么JIT編譯器會(huì)重復(fù)使用該類型。C#的泛型類型可以應(yīng)用于強(qiáng)大的反射技術(shù)。泛型無需類型的轉(zhuǎn)換操作,減少了裝箱和拆箱的操作,性能提高。泛型類型的聲明不僅可單獨(dú)聲明,也可在基類中包含泛型類型的聲明。使用泛型類型可以最大限度地重用代碼、保護(hù)類型的安全以及提高性能。泛型最常見的用途是創(chuàng)建集合類。.NET 2.0的System.Collections.Generics 命名空間包含了泛型集合定義。各種不同的集合/容器類都被“參數(shù)化”了。為使用它們,只需簡單地指定參數(shù)化的類型即可。泛型的特點(diǎn)如果實(shí)例化泛型類型的參數(shù)相同,那么JIT編譯器會(huì)重常用泛型格式編程時(shí)需要引入System.

15、Collection.Generic名稱空間,最為常用的有以下兩個(gè): List T類型對(duì)象的集合。使用方法與ArrayList類似,但它不僅比ArrayList更安全,而且明顯地更加快速。 Dictionary V類型的項(xiàng)與K類型的鍵值相關(guān)的集合,可以理解Dictionary 是 Hashtable的泛型版本 。常用泛型格式編程時(shí)需要引入System.Collection知識(shí)點(diǎn)3:泛型集合創(chuàng)建T類型對(duì)象的泛型集合語法為:List 泛型對(duì)象名=new List(); 添加泛型List的數(shù)據(jù)項(xiàng)Add():向列表尾部添加,輸入?yún)?shù)為T類型數(shù)據(jù)AddRange():向列表尾部添加,輸入?yún)?shù)為T類型對(duì)象

16、組Insert():向指定位置添加,輸入數(shù)據(jù)為位置索引和要添加的對(duì)象(T類型) 知識(shí)點(diǎn)3:泛型集合創(chuàng)建T類型對(duì)象的泛型集合語法為:示例:類型安全的泛型列表在上例中,我們編寫了一個(gè)泛型的列表的例子,在尖括號(hào)內(nèi)指定參數(shù)類型為int。該代碼的執(zhí)行將產(chǎn)生結(jié)果“Total is 7”。現(xiàn)在,如果去掉語句doubleList.Add(5.0)的注釋,將得到一個(gè)編譯錯(cuò)誤。編譯器指出它不能發(fā)送值5.0到方法Add(),因?yàn)樵摲椒▋H接受int型。不同于前例,這里的代碼實(shí)現(xiàn)了類型安全。 List aList = new List(); aList.Add(3); aList.Add(4); / aList.Add

17、(5.0); int total = 0; foreach (int val in aList) total = total + val; Console.WriteLine(Total is 0, total);示例:類型安全的泛型列表 示例:創(chuàng)建一個(gè)泛型類 public class MyListprivate static int objCount = 0;public MyList()objCount+; public int Countgetreturn objCount; class SampleClass class Programstatic void Main(string a

18、rgs)MyList myIntList = new MyList();MyList myIntList2 = new MyList();MyList myDoubleList = new MyList();MyList mySampleList = new MyList();Console.WriteLine(myIntList.Count);/輸出2Console.WriteLine(myIntList2.Count);/輸出2Console.WriteLine(myDoubleList.Count);/輸出1Console.WriteLine(mySampleList.Count);/輸

19、出1Console.WriteLine(new MyList().Count);/輸出2Console.ReadLine();示例:創(chuàng)建一個(gè)泛型類 public class【例4-9】編程判斷一個(gè)字符串是否是回文?;匚氖侵敢粋€(gè)字符序列以中間字符為基準(zhǔn)兩邊字符完全相同,如字符序列“ACBDEDBCA”是回文算法思想:判斷一個(gè)字符序列是否是回文,就是把第一個(gè)字符與最后一個(gè)字符相比較,第二個(gè)字符與倒數(shù)第二個(gè)字符比較,依次類推,第i個(gè)字符與第n-i個(gè)字符比較。如果每次比較都相等,則為回文,如果某次比較不相等,就不是回文。因此,可以把字符序列分別入隊(duì)列和棧,然后逐個(gè)出隊(duì)列和出棧并比較出隊(duì)列的字符和出棧的

20、字符是否相等,若全部相等則該字符序列就是回文,否則就不是回文。 class Program static void Main(string args) Stack s = new Stack(50); Queue q = new Queue(50); string str = Console.ReadLine(); for (int i = 0; i str.Length; +i) s.Push(stri); q.Enqueue(stri); while (s.Count != 0 & q.Count != 0) if (s.Pop() != q.Dequeue() break; if (s.

21、Count != 0 | q.Count != 0) Console.WriteLine(這不是回文!); else Console.WriteLine(這是回文!); Console.ReadKey(); 【例4-9】編程判斷一個(gè)字符串是否是回文?;匚氖侵敢粋€(gè)字符序泛型集合Dictionary泛型集合Dictionary存儲(chǔ)數(shù)據(jù)的方式和哈希表類似,通過鍵/值對(duì)來保存數(shù)據(jù)。它具有泛型的全部特征,編譯的時(shí)候就檢查類型約束,獲取元素的時(shí)候無須類型轉(zhuǎn)換。定義語法如下:Dictionary t=new Dictionary();泛型提供了很好的類型安全策略,添加、刪除、遍歷等操作和HashTable是

22、類似的。泛型集合Dictionary泛型集合Diction27引例分析與實(shí)現(xiàn)簡單迷宮實(shí)現(xiàn)迷宮問題:尋找一條從入口到出口的通路。8123456781234567入口出口前進(jìn)方向: 上(北)、下(南)、左(西)、右(東)東南北西 走步規(guī)則:首先從向下開始,按照逆時(shí)針方向搜索下一步可能前進(jìn)的位置27引例分析與實(shí)現(xiàn)簡單迷宮實(shí)現(xiàn)迷宮問題:尋找一條從入口到28棧迷宮問題8123456781234567(1,1)i(2,1)i(3,1)i(4,1)i(5,1)i(6,1)(7,1)i引例分析28棧迷宮問題8123456781234567(1,1)i(29棧8123456781234567(1,1)i(2,1

23、)i(3,1)i(4,1)i(5,1)i(6,1)(7,1)i (5,2)i(5,3)i(6,3)i(6,4)i(8,8)iiiiii引例分析迷宮問題29棧8123456781234567(1,1)i(2,1)引例實(shí)現(xiàn) /*向下(南)訪問*/ static bool stepdown(int i, int j) i+; if (i = 8) return false; if (ai, j = 0) return true; return false; /*向右(東)訪問*/ static bool stepright(int i, int j) j+; if (j = 8) return fa

24、lse; if (ai, j = 0 ) return true; return false; /*向上(北)訪問*/ static bool stepup(int i, int j) i-; if (i 0) return false; if (ai, j = 0) return true; return false; /*向左(西)訪問*/ static bool stepleft(int i, int j) j-; if (j 0) return false; if (ai, j = 0) return true; return false; static void migong(Stack s) int i = 0, j = 0, x; while (true) if (ai, j = 0) s.Push(i

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論