版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
VisualC#2008程序設(shè)計(jì)
第7章集合和泛型17十二月2023VisualC#2008程序設(shè)計(jì)第7章集合和泛型7.1集合與集合接口7.2泛型集合17十二月2023VisualC#2008程序設(shè)計(jì)7.1集合與集合接口集合就如同數(shù)組,用來存儲(chǔ)和管理一組特定類型的數(shù)據(jù)對(duì)象,除了基本的數(shù)據(jù)處理功能,集合直接提供了各種數(shù)據(jù)結(jié)構(gòu)及算法的實(shí)現(xiàn),如隊(duì)列、鏈表、排序等,可以讓你輕易地完成復(fù)雜的數(shù)據(jù)操作。在使用數(shù)組和集合時(shí)要先加入System.Collections命名空間,它提供了支持各種類型集合的接口及類。集合本身上也是一種類型,基本上可以將其作為用來存儲(chǔ)一組數(shù)據(jù)對(duì)象的容器,由C#面向?qū)ο蟮奶匦裕芾頂?shù)據(jù)對(duì)象的集合同樣被實(shí)現(xiàn)成為對(duì)象,而存儲(chǔ)在集合中的數(shù)據(jù)對(duì)象則被稱為集合元素。17十二月2023VisualC#2008程序設(shè)計(jì)7.1集合與集合接口C#ArrayList正是采用上述方法來動(dòng)態(tài)改變數(shù)組大小的。C#ArrayList又被稱為動(dòng)態(tài)數(shù)組,它的存儲(chǔ)空間可以被動(dòng)態(tài)改變,同時(shí)還擁有添加、刪除元素的功能。ArrayList類派生自System.Collections,在使用時(shí)需要事先聲明并引用該命名空間。下面以一個(gè)例子來說明如何適用ArrayList類。在這個(gè)例子中演示了如何創(chuàng)建ArrayList,并輸出該動(dòng)態(tài)數(shù)據(jù)組的值?!纠?-1】ArrayList用法舉例。//Ch07_01.csusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Collections;//自己添加的代碼namespaceCh07_01{classProgram{
17十二月2023VisualC#2008程序設(shè)計(jì)7.1集合與集合接口publicstaticvoidMain(){//創(chuàng)建并初始化一個(gè)ArrayList.ArrayListmyAL=newArrayList();myAL.Add("Hello");myAL.Add("World");myAL.Add("!");//顯示ArrayList個(gè)數(shù).Console.WriteLine("myAL");Console.WriteLine("Count:{0}",myAL.Count);Console.Write("Values:");PrintValues(myAL);}//顯示ArrayListpublicstaticvoidPrintValues(IEnumerablemyList){foreach(ObjectobjinmyList)Console.Write("{0}",obj);Console.WriteLine();}}}17十二月2023VisualC#2008程序設(shè)計(jì)7.1集合與集合接口在.NETFramework中,Hashtable是System.Collections命名空間提供的一個(gè)容器,用于處理和表現(xiàn)類似key/value的鍵值對(duì),其中key通常可用來快速查找,同時(shí)key是區(qū)分大小寫;value用于存儲(chǔ)對(duì)應(yīng)于key的值。Hashtable中key/value鍵值對(duì)均為object類型,所以Hashtable可以支持任何類型的key/value鍵值對(duì).Hashtable的主要操作:在哈希表中添加一個(gè)key/value鍵值對(duì):HashtableObject.Add(key,value);在哈希表中去除某個(gè)key/value鍵值對(duì):HashtableObject.Remove(key);通過鍵獲得值:HashtableObject[key]判斷哈希表是否包含特定鍵key:HashtableObject.Contains(key);17十二月2023VisualC#2008程序設(shè)計(jì)7.1集合與集合接口【例7-2】Hashtable用法舉例。//Ch07_02.csusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Collections;//自己添加的代碼namespaceCh07_02{classProgram{publicstaticvoidMain(){//創(chuàng)建新哈希表
HashtableopenWith=newHashtable();//為哈希表增加鍵值對(duì),其中鍵不可重復(fù),但值可以重復(fù)
openWith.Add("txt","notepad.exe");openWith.Add("bmp","paint.exe");openWith.Add("dib","paint.exe");openWith.Add("rtf","wordpad.exe");//如果增加的鍵與哈希表中已有的鍵重復(fù),則拋出異常17十二月2023VisualC#2008程序設(shè)計(jì)7.1集合與集合接口try{openWith.Add("txt","winword.exe");}catch{Console.WriteLine("哈希表中已包含以\"txt\"為鍵的元素.");}//可以通過鍵獲得該鍵對(duì)應(yīng)的值
Console.WriteLine("鍵=\"rtf\",值={0}.",openWith["rtf"]);//修改鍵所對(duì)應(yīng)的值
openWith["rtf"]="winword.exe";Console.WriteLine("鍵=\"rtf\",值={0}.",openWith["rtf"]);//如果不存在該鍵,將為哈希表增加鍵值對(duì),如果存在該鍵,則修改值。
openWith["doc"]="winword.exe";//首先查看是否包含某鍵,再增加
if(!openWith.ContainsKey("ht")){openWith.Add("ht","hypertrm.exe");Console.WriteLine("為鍵=\"ht\"增加值:{0}",openWith["ht"]);}//遍歷哈希表中所有鍵值對(duì)
Console.WriteLine();foreach(DictionaryEntrydeinopenWith){Console.WriteLine("鍵={0},值={1}",de.Key,de.Value);}17十二月2023VisualC#2008程序設(shè)計(jì)7.1集合與集合接口//獲得值的集合
ICollectionvalueColl=openWith.Values;//通過強(qiáng)制類型轉(zhuǎn)化獲得值集合中的對(duì)象
Console.WriteLine();foreach(stringsinvalueColl){Console.WriteLine("值={0}",s);}//獲得鍵集合
ICollectionkeyColl=openWith.Keys;//通過強(qiáng)制類型轉(zhuǎn)化獲得鍵集合中的對(duì)象
Console.WriteLine();foreach(stringsinkeyColl){Console.WriteLine("鍵={0}",s);}//利用Remove方法根據(jù)鍵刪除哈希表中的鍵值對(duì)
Console.WriteLine("\n刪除\"doc\"");openWith.Remove("doc");if(!openWith.ContainsKey("doc")){Console.WriteLine("鍵\"doc\"不存在.");}}}}17十二月2023VisualC#2008程序設(shè)計(jì)7.1集合與集合接口接口在具體集合類的實(shí)現(xiàn)中扮演著非常重要的角色,所有集合都直接或間接基于ICollection接口。ICollection接口:集合類的基接口,包含表示集合中元素個(gè)數(shù)、是否為線程安全等成員屬性,還包含一個(gè)將集合元素復(fù)制到數(shù)組的方法。IComparer接口:提供了用于比較兩個(gè)對(duì)象的方法,如果希望集合中的對(duì)象可以排序,這個(gè)方法有很重要的作用。IDictionary接口:允許對(duì)象將其數(shù)據(jù)表示為鍵-值對(duì)集合。IEnumerator、IEnumerable接口:支持foreach對(duì)集合的一種簡(jiǎn)單迭代處理,迭代時(shí)只能讀取集合中的數(shù)據(jù)。IList接口:所有列表的基接口,控制能否在列表中修改、增加、刪除元素。在基于IList接口的集合中(如Array、ArrayList或List)或直接基于ICollection接口的集合中(如Queue、Stack或inkedList),每個(gè)元素都包含一個(gè)值。在基于IDictionary接口的集合中(如Hashtable和SortedList類、或者Dictionary和SortedList泛型類),每個(gè)元素都包含一個(gè)鍵和值。17十二月2023VisualC#2008程序設(shè)計(jì)7.2泛型集合7.1節(jié)中介紹了集合類。任何類型的對(duì)象要存儲(chǔ)在集合類中都必須強(qiáng)制轉(zhuǎn)化為Object類型,當(dāng)從集合類中獲得元素時(shí)又要轉(zhuǎn)化成先前的類型。為了讓編譯提供更強(qiáng)的編譯時(shí)類型檢查,減少數(shù)據(jù)類型之間的顯示轉(zhuǎn)換,以及裝箱操作和運(yùn)行時(shí)類型檢查,C#引入了泛型的概念。簡(jiǎn)單的說,泛型可以讓類、結(jié)構(gòu)、接口、委托和方法按照自己存儲(chǔ)的操作的數(shù)據(jù)類型進(jìn)行參數(shù)化。
ArrayListprimes=newArrayList();primes.Add(1);primes.Add(3);primes.Add("text");intpSum=(int)primes[0]+(int)primes[1];可以替換為如下代碼,其中使用了泛型版本的ArrayList:List<int>primes=newList<int>();primes.Add(1);primes.Add(3);//primes.Add("text");//無(wú)法通過編譯intpSum=primes[0]+primes[1];17十二月2023VisualC#2008程序設(shè)計(jì)7.2泛型集合List聲明中包含一個(gè)類型參數(shù),它告訴編譯器:對(duì)象可以包含什么類型的數(shù)據(jù)(在上面的例子中,類型為int),然后編譯器生成需要指定類型的代碼。對(duì)于開發(fā)人員來說,這就消除了運(yùn)行時(shí)的強(qiáng)制類型轉(zhuǎn)換和類型驗(yàn)證工作。從內(nèi)存利用和效率的角度來看,如果集合中存儲(chǔ)的是基本類型,那么還消除了裝箱(轉(zhuǎn)換為對(duì)象)的過程。17十二月2023VisualC#2008程序設(shè)計(jì)7.2泛型集合Stack又稱為堆?;驐#且环N重要的線性數(shù)據(jù)結(jié)構(gòu),棧只能在一端進(jìn)行數(shù)據(jù)輸入和輸出操作,且遵循“后進(jìn)先出”的原則,它有一個(gè)固定的棧底和浮動(dòng)的棧頂。向棧中輸入數(shù)據(jù)的操作稱為“入棧”,被壓入的數(shù)據(jù)保存在棧頂,同時(shí)棧頂指針上浮一個(gè);同樣從棧中輸出數(shù)據(jù)的操作稱為“出棧”,只有棧頂元素才能出棧,如果棧頂指針指向了棧底,說明當(dāng)前的棧是空的。Stack類時(shí)用來實(shí)現(xiàn)棧的工具類,它能實(shí)現(xiàn)棧操作的主要方法,如下所示:(1)Push(objectobj)方法:將指定對(duì)象壓入棧的頂部;(2)Pop()方法:移出并返回位于Stack頂部的對(duì)象;(3)Peek()方法:返回位于棧頂?shù)膶?duì)象,但不將此對(duì)象移出。17十二月2023VisualC#2008程序設(shè)計(jì)7.2泛型集合【例7-3】Stack用法舉例。//Ch07_03.csusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceCh07_03{classProgram{publicstaticvoidMain(){string[]name={"武漢","軟件","職業(yè)","學(xué)院"};Stack<string>stk=newStack<string>();//壓棧
for(inti=0;i<name.Length;i++)stk.Push(name[i]);//stk.Push(1.5);//無(wú)法通過編譯
//出棧
while(stk.Count>0)Console.WriteLine(stk.Pop());}}}17十二月2023VisualC#2008程序設(shè)計(jì)7.2泛型集合Queue類(隊(duì)列)也是非常重要的線性數(shù)據(jù)結(jié)構(gòu),它在按接收順序存儲(chǔ)消息方面非常有用。與棧不同,隊(duì)列在一端輸入數(shù)據(jù)(也叫入隊(duì)),另一端輸出數(shù)據(jù)(也叫出隊(duì))。隊(duì)列中數(shù)據(jù)的插入和刪除都只能在隊(duì)列的頭尾處進(jìn)行,而不能直接在任意位置插入或刪除數(shù)據(jù),它的操作遵循“先進(jìn)先出”原則。每個(gè)隊(duì)列都有一個(gè)容量,如果存儲(chǔ)的元素?cái)?shù)達(dá)到了它的容量,這個(gè)容量還會(huì)自動(dòng)增加以滿足需要,隊(duì)列有一個(gè)增長(zhǎng)系數(shù),它表示了當(dāng)隊(duì)列滿了容量的增加值,用戶也可以直接在Queue類的構(gòu)造函數(shù)中設(shè)定
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024裝修垃圾清運(yùn)合同范本
- 2024年廢棄物處理爆破合同
- 2024家庭保姆用工合同版
- 2024年商場(chǎng)室內(nèi)LED廣告屏購(gòu)銷合同
- 2024年工程項(xiàng)目質(zhì)量保證與驗(yàn)收合同條款
- 二手房產(chǎn)買賣合同協(xié)議模板
- 2024年簡(jiǎn)化版購(gòu)房合同協(xié)議
- 各類維修合同范文集成
- 合同訴訟時(shí)效問題
- 2024版店鋪合租合同樣本
- 2024年企業(yè)數(shù)據(jù)存儲(chǔ)與安全服務(wù)合同
- 2022年北京市公務(wù)員錄用考試《行測(cè)》真題及答案解析
- 江蘇省泰興市2024-2025學(xué)年高三上學(xué)期期中考試語(yǔ)文試題(含答案)
- 家長(zhǎng)會(huì)教學(xué)課件
- 律師事務(wù)所律師事務(wù)所風(fēng)險(xiǎn)管理手冊(cè)
- 靜脈曲張的護(hù)理查房課件
- 廣東省郵政公司招聘2024年應(yīng)屆高校畢業(yè)生(152人)高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
- 四川省綿陽(yáng)市高中2022級(jí)第一次診斷性考試數(shù)學(xué)試題(解析版)
- DB11∕T 353-2014 城市道路清掃保潔質(zhì)量與作業(yè)要求
- 2024年消防宣傳月知識(shí)競(jìng)賽考試題庫(kù)500題(含答案)
- 國(guó)開2024年秋《機(jī)電控制工程基礎(chǔ)》形考任務(wù)1答案
評(píng)論
0/150
提交評(píng)論