csharpnet課件_第1頁(yè)
csharpnet課件_第2頁(yè)
csharpnet課件_第3頁(yè)
csharpnet課件_第4頁(yè)
csharpnet課件_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第四章 數(shù)組和集合,C#.net程序設(shè)計(jì),csharpnet,本章主要內(nèi)容,集合類型接口IEnumerable、ICollection、IList和IDictionary 數(shù)組Array、ArrayList和List泛型類 Hashtable類和Dictionary泛型類 SortedList和SortedList泛型類 隊(duì)列Queue類和Queue泛型類,堆棧Stack類和Stack 泛型類,csharpnet,集合類型概述,集合通??梢苑譃槌S眉? 專用集合等類型: 常用集合。常用集合有泛型和非泛型之分。非泛型集合是以O(shè)bject 類型為元素集合,如哈希表Hashtable、隊(duì)列Queu

2、e、堆棧Stack、和列表ArrayList,。泛型集合類型是非泛型類型的直接模擬。泛型集合包含ArrayList的泛型版List,Hashtable的泛型版Dictionary集合等。 專用集合。這些集合都具有專門(mén)的用途,通常用于處理特定的元素類型,如 StringDictionary是將鍵和值強(qiáng)類型化為字符串而不是Object來(lái)實(shí)現(xiàn)Hashtable集合類型。,集合類型,csharpnet,IEnumerable接口,集合是基于IEnumerable接口、ICollection接口、IList接口、IDictionary接口,或其泛型集合中的相應(yīng)接口,而IEnumerable接口、ICol

3、lection接口是大部分集合類所共同實(shí)現(xiàn)的。下面分別介紹IEnumerable接口、ICollection接口。 第一種集合是實(shí)現(xiàn)IEnumerable接口的集合類,IEnumerable接口只有一個(gè)公共方法:IEnumerator GetEnumerator() 該方法返回一個(gè)用于foreach簡(jiǎn)單迭代循環(huán)訪問(wèn)集合的枚舉數(shù)。所有實(shí)現(xiàn)了IEnumerable接口的集合類如數(shù)組Array,ArrayList集合類型等都可以用于foreach循環(huán)語(yǔ)句。IEnumerator接口的成員如下表。,集合類型,csharpnet,ICollection 接口,ICollection 接口繼承IEnume

4、rable接口,除了繼承IEnumerable接口成員外,還有下表所示的成員。,集合類型,csharpnet,List 接口,List 接口表示可按照索引單獨(dú)訪問(wèn)的對(duì)象的非泛型集合接口。IList 接口繼承了ICollection接口和IEnumerable接口,IList是所有非泛型列表的基接口。IList接口的公共屬性與方法 如下表:,數(shù)組Array、ArrayList和List泛型類,csharpnet,數(shù)組Array類,Array 類是所有數(shù)組的基類,提供創(chuàng)建、操作、搜索和排序數(shù)組的方法,Array 類定義語(yǔ)法如下:public abstract class Array : IClon

5、eable, IList, ICollection, IEnumerable。因此Array類實(shí)現(xiàn)IList, ICollection, IEnumerable,ICloneable接口,也就是說(shuō),Array類實(shí)現(xiàn)了這些接口的方法成員。 Array類除了Copy,CopyTo外其它常用的方法: Array.Clear方法:public static void Clear (Array array,int index,int length) Array.Clone方法是實(shí)現(xiàn)ICloneable接口的方法,Clone方法創(chuàng)建數(shù)組Array的淺表副本,數(shù)組的淺表副本僅復(fù)制數(shù)組的元素(無(wú)論它們是引用類

6、型還是值類型),但不復(fù)制這些引用所引用的對(duì)象。新數(shù)組中的引用與原始數(shù)組中的引用指向相同的對(duì)象。數(shù)組使用Copy,CopyTo方法復(fù)制的也是淺表副本。所以這三個(gè)復(fù)制方法得到的復(fù)制的副本都是一樣。,數(shù)組Array、ArrayList和List泛型類,public class Student public string Name; public Student(string Name) this.Name = Name; public class CloneCopyArray public static void Main() Student stu0 = new Student(student1)

7、; Student stu1 = new Student(student2); Student stu2 = new Student(student3); Student arrStu = new Student stu0, stu1, stu2; Student arrStuClone = (Student)arrStu.Clone();/ 克隆數(shù)組 Student arrStuCopy = new StudentarrStu.Length; Array.Copy(arrStu,arrStuCopy, arrStu.Length);/拷貝數(shù)組 Console.WriteLine(原來(lái)數(shù)組內(nèi)容

8、); PrintIndexAndValues(arrStu); Console.WriteLine(克隆數(shù)組內(nèi)容:); PrintIndexAndValues(arrStuClone); Console.WriteLine(改變克隆數(shù)組內(nèi)容之前);,例:演示數(shù)組Array的Copy和Clone方法的使用, CloneCopyArray項(xiàng)目代碼:,Console.WriteLine(arrStu2.Name: 0, arrStu2.Name); Console.WriteLine(arrStuClone2.Name: 0, arrStuClone2.Name); Console.WriteLin

9、e(arrStuCopy2.Name: 0, arrStuCopy2.Name); arrStuClone2.Name = student2CloneNew; /arrStuCopy2.Name = student2CopyNew; Console.WriteLine(改變克隆數(shù)組內(nèi)容之后); Console.WriteLine(arrStu2.Name: 0, arrStu2.Name); Console.WriteLine(arrStuClone2.Name: 0, arrStuClone2.Name); Console.WriteLine(arrStuCopy2.Name: 0, arr

10、StuCopy2.Name); public static void PrintIndexAndValues(Array myArray) for (int i = myArray.GetLowerBound(0); i = myArray.GetUpperBound(0); i+) Console.WriteLine(t0:t1, i, myArray.GetValue(i); arrStuClone是使用clone方法復(fù)制的student類對(duì)象數(shù)組,arrStuCopy是使用copy方法復(fù)制的student類對(duì)象數(shù)組,由于它們都是復(fù)制的淺表副本,所以在三個(gè)數(shù)組的引用都指向相同的studen

11、t類對(duì)象數(shù)組。,csharpnet,ArrayList 類,Array用作所有數(shù)組的基類,而ArrayList是較為復(fù)雜的數(shù)組。ArrayList 類和Array 類一樣都實(shí)現(xiàn)IList, ICollection, IEnumerable, ICloneable接口。 ArrayList類除了所實(shí)現(xiàn)的IList, ICollection, IEnumerable, ICloneable接口的方法成員,還包含下面主要屬性和方法:,使用ArrayList類Add、AddRange和ToArray方法的項(xiàng)目ArrayListSample代碼: using System;using System.Co

12、llections; public class SamplesArrayList public static void Main() ArrayList myAL = new ArrayList();/ 創(chuàng)建和初始化ArrayList. myAL.Add(The);/添加一個(gè)元素 myAL.AddRange(new string quick, brown, fox, jumped, over, the, lazy, dog );/添加一組元素 PrintIndexAndValues(myAL); / 顯示ArrayList的值 String myArr = (String)myAL.ToArr

13、ay(typeof(string); /將元素復(fù)制數(shù)組 PrintIndexAndValues(myArr); / 顯示數(shù)組內(nèi)容 public static void PrintIndexAndValues(ArrayList myList) int i = 0; foreach (Object o in myList) Console.Write(t0:t1, i+, o); public static void PrintIndexAndValues(String myArr) for (int i = 0; i myArr.Length; i+) Console.Write(t0:t1,

14、 i, myArri); ,csharpnet,List 泛型類,List 泛型類是 ArrayList 類的泛型等效類,表示可通過(guò)索引訪問(wèn)的強(qiáng)類型列表。所謂的強(qiáng)類型,是指創(chuàng)建列表List時(shí)指定集合類型,而不是ArrayList的object集合類型,這樣對(duì)于值類型的List泛型類來(lái)說(shuō),無(wú)需裝箱和取消裝箱或轉(zhuǎn)換。 ListTSample項(xiàng)目的代碼示例演示 List 泛型類: using System; using System.Collections.Generic; public class Example public static void Main() /創(chuàng)建string的List泛型

15、實(shí)例,創(chuàng)建列表時(shí)指定集合類型為string List dinosaurs = new List(); Console.WriteLine(nCapacity: 0, dinosaurs.Capacity);/顯示List容量 dinosaurs.Add(Tyrannosaurus);/向List添加 dinosaurs.Add(Amargasaurus); dinosaurs.Add(Mamenchisaurus); dinosaurs.Add(Deinonychus);,dinosaurs.Add(Compsognathus); foreach (string dinosaur in din

16、osaurs) Console.WriteLine(dinosaur); Console.WriteLine(nCapacity: 0, dinosaurs.Capacity); Console.WriteLine(Count: 0, dinosaurs.Count); Console.WriteLine(nContains(Deinonychus): 0, dinosaurs.Contains(Deinonychus);/判斷列表是否包含Deinonychus dinosaurs.Insert(2, Compsognathus);/在位置插入Compsognathus“ foreach (s

17、tring dinosaur in dinosaurs) Console.WriteLine(dinosaur); Console.WriteLine(ndinosaurs3: 0, dinosaurs3);/使用位置索引 dinosaurs.Remove(Compsognathus);/刪除Compsognathus foreach (string dinosaur in dinosaurs) Console.WriteLine(dinosaur); dinosaurs.TrimExcess();/根據(jù)集合數(shù)量縮減容量 Console.WriteLine(nTrimExcess()nCapa

18、city: 0, dinosaurs.Capacity); Console.WriteLine(Count: 0, dinosaurs.Count); dinosaurs.Clear();/清空 Console.WriteLine (nClear()nCapacity: 0, dinosaurs.Capacity); Console.WriteLine(Count: 0, dinosaurs.Count); ,csharpnet,List 泛型類,代碼分析: 使用默認(rèn)構(gòu)造函數(shù)創(chuàng)建一個(gè)空的字符串類型的List泛型列表。隨后顯示 Capacity 屬性,然后使用 Add 方法添加若干個(gè)項(xiàng)。添加的項(xiàng)

19、被列出,Capacity 屬性會(huì)同 Count 屬性一起再次顯示,指示已根據(jù)需要增加了容量。 使用 Contains 方法測(cè)試該列表中是否存在某個(gè)項(xiàng),使用 Insert 方法在列表的中間插入一個(gè)新項(xiàng),然后再次顯示列表的內(nèi)容。 默認(rèn)的 Item 屬性(C# 中的索引器)用于檢索項(xiàng),Remove 方法用于移除前面添加的重復(fù)項(xiàng)的第一個(gè)實(shí)例,然后,該示例再次顯示內(nèi)容。Remove 方法總是移除它所遇到的第一個(gè)實(shí)例。 使用 TrimExcess 方法減小容量以匹配計(jì)數(shù),然后顯示 Capacity 和 Count 屬性。如果未用容量已經(jīng)小于總?cè)萘康?10%,則列表容量不會(huì)進(jìn)行調(diào)整。 使用 Clear 方法

20、移除列表中的所有項(xiàng),并顯示 Capacity 和 Count 屬性。,數(shù)組Array、ArrayList和List泛型類,csharpnet,List,ArrayList 類與Array數(shù)組的區(qū)別:,Array 的容量是固定的,而 ArrayList的容量可根據(jù)需要自動(dòng)擴(kuò)充。如果更改了 Capacity 屬性的值,則可以自動(dòng)進(jìn)行內(nèi)存重新分配和元素復(fù)制。 ArrayList提供添加、插入或移除某一范圍元素的方法。在 Array 中,只能一次獲取或設(shè)置一個(gè)元素的值。 使用 Synchronized 方法很容易創(chuàng)建 ArrayList 的同步版本。Array 將實(shí)現(xiàn)同步的任務(wù)留給了用戶。 Array

21、List提供將只讀和固定大小包裝返回到集合的方法;而 Array 不提供。 可以設(shè)置 Array 的下限,但 ArrayList的下限始終為零。 Array 可以具有多個(gè)維度,而 ArrayList始終只是一維的。 特定類型(不包括Object)的數(shù)組Array的性能優(yōu)于ArrayList,這是因?yàn)锳rrayList的元素屬于Object類型,所以在存儲(chǔ)或檢索值類型時(shí)通常發(fā)生裝箱和取消裝箱操作。不過(guò),在不需要重新分配時(shí)(即最初的容量十分接近列表的最大容量),List泛型類的性能與同類型的數(shù)組十分相近。 需要數(shù)組的大多數(shù)情況都可以改為使用ArrayList或List泛型類;它們更容易使用,并且一

22、般與相同類型的數(shù)組具有相近的性能。盡量使用List類,而不是使用ArrayList類或自己編寫(xiě)強(qiáng)類型包裝集合。,數(shù)組Array、ArrayList和List泛型類,csharpnet,Hashtable 、Dictionary和SortedList集合類,Hashtable 、Dictionary和SortedList集合類都實(shí)現(xiàn)IDictionary, ICollection, IEnumerable, ICloneable接口。其中IDictionary接口表示鍵/值對(duì)的集合接口,或者說(shuō)Hashtable 、Dictionary和SortedList都是關(guān)于鍵/值對(duì)的集合。 IDictio

23、nary接口是鍵/值對(duì)的非通用集合的基接口。每個(gè)元素都是一個(gè)存儲(chǔ)在 DictionaryEntry對(duì)象中的鍵/值對(duì)。 IDictionary接口繼承了ICollection, IEnumerable接口,除了ICollection,IEnumerable接口成員外,還有以下成員:,IDictionary接口成員,using System.Collections;/使用Hashtable類的項(xiàng)目HashtableSample的代碼 : public class SamplesHashtable public static void Main() Hashtable ht = new Hashta

24、ble();/創(chuàng)建Hashtable實(shí)例ht ht.Add(N01, 張三);/添加將帶有指定鍵和值的元素添加到ht ht.Add(N02, 李四); ht.Add(N03, 王五); Console.WriteLine(ht:Count:0, ht.Count); /顯示Hashtable的屬性Count PrintKeysAndValues(ht); public static void PrintKeysAndValues(Hashtable ht) foreach (DictionaryEntry de in ht)/顯示Hashtable的鍵和值 Console.Write(0,1)

25、, de.Key, de.Value); 使用Hashtable的Add(Objectkey, Objectvalue)方法集合添加元素。 Hashtable的元素是一個(gè)鍵/值對(duì),元素類型既不是鍵的類型,也不是值的類型,而是DictionaryEntry類型,因此foreach循環(huán)語(yǔ)句使用foreach(DictionaryEntryde in ht)。 DictionaryEntry是結(jié)構(gòu)類型,具有object類型的鍵屬性Key和object類型的值屬性Key。,使用Dictionary泛型類DictionarySample項(xiàng)目代碼:,public class Sample public s

26、tatic void Main() / 創(chuàng)建鍵和值都為string的dictionary對(duì)象實(shí)例openWith. Dictionary openWith =new Dictionary(); /為dictionary實(shí)例openWith添加元素,其中鍵值唯一,有些值是重復(fù)的 openWith.Add(txt, notepad.exe); openWith.Add(bmp, paint.exe); openWith.Add(dib, paint.exe); openWith.Add(rtf, wordpad.exe); try /插入具有重復(fù)鍵的元素因起異常 openWith.Add(txt,

27、 winword.exe); catch (ArgumentException) Console.WriteLine(An element with Key = txt already exists.); / 使用鍵索引得到其值 Console.WriteLine(For key = rtf, value = 0.,openWithrtf); openWithrtf = winword.exe;/使用鍵索引設(shè)置其值 Console.WriteLine(For key = rtf, value = 0.,openWithrtf); openWithdoc = winword.exe;/如果該鍵不

28、存在,添加新key/value元素,try /如果沒(méi)有該鍵,取其值引起異常 Console.WriteLine(For key = tif, value = 0.,openWithtif); catch (KeyNotFoundException) Console.WriteLine(Key = tif is not found.); string value = ; if (openWith.TryGetValue(tif, out value)/該方法更有效,不引起異常 Console.WriteLine(For key = tif, value = 0., value); else Co

29、nsole.WriteLine(Key = tif is not found.); if (!openWith.ContainsKey(ht)/判斷是否含有該鍵 openWith.Add(ht, hypertrm.exe); Console.WriteLine(Value added for key = ht: 0,openWithht); foreach (KeyValuePair kvp in openWith)/遍歷該字典 Console.WriteLine(Key = 0, Value = 1,kvp.Key, kvp.Value); /取該字典值屬性,值集合ValueCollecti

30、on是強(qiáng)類型集合(本例string類型) Dictionary.ValueCollection valueColl =openWith.Values; foreach (string s in valueColl)/遍歷該字典值集合ValueCollection Console.WriteLine(Value = 0, s);,/取該字典的鍵屬性,鍵集合KeyCollection是強(qiáng)類型集合(本例string類型) Dictionary.KeyCollection keyColl = openWith.Keys; foreach (string s in keyColl)/遍歷該字典鍵集合Va

31、lueCollection Console.WriteLine(Key = 0, s); Console.WriteLine(n刪除鍵為(doc)的這對(duì)元素); openWith.Remove(doc); if (!openWith.ContainsKey(doc) Console.WriteLine(Key doc is not found.); 代碼分析: 使用Item屬性(即索引器)來(lái)檢索值,當(dāng)請(qǐng)求的鍵不存在時(shí)將引發(fā)KeyNotFoundException,與鍵相關(guān)聯(lián)的值可被替換。 當(dāng)程序必須經(jīng)常嘗試字典中不存在的鍵值時(shí),使用TryGetValue方法作為一種更有效的方法來(lái)檢索值,使用C

32、ontainsKey方法在調(diào)用Add方法之前測(cè)試某個(gè)鍵是否存在。 使用Keys屬性和Values屬性來(lái)單獨(dú)枚舉鍵和值。使用Remove方法刪除集合中的一個(gè)元素。,csharpnet,Queue類和Queue泛型類,Queue類和Queue泛型類都是先進(jìn)先出集合類,它們實(shí)現(xiàn)IEnumerable、ICollection和ICloneable等接口,Queue泛型類還實(shí)現(xiàn)了IEnumerable和ICollection泛型接口。 隊(duì)列在按接收順序存儲(chǔ)消息方面可以方便地進(jìn)行順序處理。此類將隊(duì)列作為循環(huán)數(shù)組實(shí)現(xiàn)。存儲(chǔ)在Queue中的對(duì)象在一端插入,從另一端移除。Queue接受空引用作為有效值并且允許重

33、復(fù)的元素。 可以對(duì)Queue及其元素執(zhí)行三種主要操作: Enqueue將一個(gè)元素添加到Queue的末尾。 Dequeue從Queue的開(kāi)始處移除最舊的元素。 Peek從Queue的開(kāi)始處返回最舊的元素,但不將其從Queue中移除。 下面是使用隊(duì)列Queue泛型類的QueueSample項(xiàng)目的代碼:,using System.Collections.Generic; class Example public static void Main() Queue numbers = new Queue(); numbers.Enqueue(one); numbers.Enqueue(two); num

34、bers.Enqueue(three); numbers.Enqueue(four); numbers.Enqueue(five); foreach (string number in numbers) Console.WriteLine(number); Console.WriteLine(nDequeuing 0, numbers.Dequeue(); Console.WriteLine(Peek at next item: 0, numbers.Peek(); Console.WriteLine(Dequeuing 0, numbers.Dequeue(); / 使用 ToArray 方

35、法將隊(duì)列元素復(fù)制到數(shù)組,然后將該數(shù)組 /傳遞給接受 IEnumerable 的 Queue 構(gòu)造函數(shù)以創(chuàng)建隊(duì)列副本 Queue queueCopy = new Queue(numbers.ToArray(); foreach (string number in queueCopy) Console.WriteLine(number); ,/創(chuàng)建一個(gè)大小是隊(duì)列大小兩倍的數(shù)組 string array2 = new stringnumbers.Count * 2; /使用 CopyTo 方法從數(shù)組中間開(kāi)始復(fù)制數(shù)組元素 numbers.CopyTo(array2, numbers.Count); /

36、使用接受IEnumerable 的Queue 構(gòu)造函數(shù)創(chuàng)建第二個(gè)隊(duì)列 Queue queueCopy2 = new Queue(array2); foreach (string number in queueCopy2) Console.WriteLine(number); Console.WriteLine(nqueueCopy.Contains(four) = 0, queueCopy.Contains(four); queueCopy.Clear(); Console.WriteLine(nqueueCopy.Count = 0, queueCopy.Count); ,使用 Enqueue 方法將五個(gè)字符串加入隊(duì)列進(jìn)行排隊(duì)。使用 Deque

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論