C#中System.Collections.Generic 下的各個(gè)容器類的用法_第1頁(yè)
C#中System.Collections.Generic 下的各個(gè)容器類的用法_第2頁(yè)
C#中System.Collections.Generic 下的各個(gè)容器類的用法_第3頁(yè)
C#中System.Collections.Generic 下的各個(gè)容器類的用法_第4頁(yè)
C#中System.Collections.Generic 下的各個(gè)容器類的用法_第5頁(yè)
已閱讀5頁(yè),還剩11頁(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、C# List<T>用法所屬命名空間:using System.Collections.Generic;  List<T>類是  ArrayList 類的泛型等效類。 該類使用大小可按需動(dòng)態(tài)增加的數(shù)組實(shí)現(xiàn)  IList<T> 泛型接口。 泛型的好處: 它為使用 c#語(yǔ)言編寫面向?qū)ο蟪绦蛟黾恿藰O大的效力和靈活性。不會(huì)強(qiáng)行對(duì)值類型進(jìn)行裝箱和拆箱,或?qū)σ妙愋瓦M(jìn)行向下強(qiáng)制類型轉(zhuǎn)換,所以性能得到提高。一、  List的基礎(chǔ)、常用方法:1、List<T> mList

2、= new List<T>();    a.T為列表中元素類型,現(xiàn)在以string類型作為例子如:  List<string> mList = new List<string>();b.增加元素:List. Add(T item)    添加一個(gè)元素如:mList.Add("賴炎濱");c.插入元素:Insert(int index, T item);    在index位置添加一個(gè)元素如:mList

3、.Insert(1, "laiyanbin"); d.刪除元素:  List. Remove(T item)       刪除一個(gè)值                如:mList.Remove("賴炎濱");       

4、0;         List. RemoveAt(int index);   刪除下標(biāo)為index的元素               如.:mList.RemoveAt(0);            

5、0;    List. RemoveRange(int index, int count);   從下標(biāo)index開始,刪除count個(gè)元素                如.:mList.RemoveRange(3, 2); /超出刪除的范圍會(huì)出錯(cuò)注:刪除某元素后,其后面的元素下標(biāo)自動(dòng)跟進(jìn)e.判斷是否存在List:List. Contains(T item)

6、0;  得到的結(jié)果是返回true或falsef.排序:List. Sort ()   /默認(rèn)是元素第一個(gè)字母按升序            給List里面元素順序反轉(zhuǎn):           List. Reverse ()   /可以與List. Sort ()配合使用,達(dá)到想要的效果遍歷L

7、ist中元素:   foreach (T element in mList)  T的類型與mList聲明時(shí)一樣                             Console.WriteLine(element);   &

8、#160;         g.List清空:List. Clear ()           如:mList.Clear();h.獲得List中元素?cái)?shù)目:           List. Count ()    返回int值i.添加數(shù)組進(jìn)List:

9、string temArr = Ha","Hunter", "Tom", "Lily", "Jay", "Jim", "Kuku", " "Locu" ;            mList.AddRange(temArr);2、List<T> testList =new List<T> (IEn

10、umerable<T> collection);      以一個(gè)集合作為參數(shù)創(chuàng)建List       E.g.: string temArr = "Ha", "Hunter", "Tom", "Lily", "Jay", "Jim", "Kuku", "Locu" ;  &#

11、160;               List<string> testList = new List<string>(temArr);3、List與數(shù)組的相互轉(zhuǎn)換1.從string轉(zhuǎn)List<string>例如:string str=“1”,”2”;List <string> list=new List<string>(str);2.從List<string>轉(zhuǎn)string

12、 例如:List<string> list=new List<string>String str=list.ToArray();/ViewState"idlist"轉(zhuǎn)換成List<>List<int> idlist=(List<int>)ViewState"idlist"這段代碼演示了System.Collections.Generic的各容器類的用法,包括:Dictionary,KeyValuePair,SortedDictionary,SortedList,HashSet,Sort

13、edSet,List,Queue,Stack等類的用法C#view sourceprint?System.Collections.Generic.Dictionary<>       /鍵/值對(duì)集合System.Collections.Generic.KeyValuePair<>     /鍵/值對(duì)結(jié)構(gòu), 作為 Dictionary<> 的一個(gè)元素存在System.Collections.Generic.SortedDictionary&l

14、t;> /相當(dāng)于 Key 能自動(dòng)排序 Dictionary<>System.Collections.Generic.SortedList<>       /和 SortedDictionary<> 功能相似, 但內(nèi)部算法不同, 其 Keys、Values 可通過(guò)索引訪問(wèn) System.Collections.Generic.HashSet<>   /無(wú)序、無(wú)重復(fù)的元素集合System.Collections.Generic

15、.SortedSet<> /相當(dāng)于能自動(dòng)排序的 HashSet<>System.Collections.Generic.List<>      /相當(dāng)于泛型的 ArrayList, 元素可重復(fù)、可排序、可插入、可索引訪問(wèn) System.Collections.Generic.Queue<> /隊(duì)列, 先進(jìn)先出System.Collections.Generic.Stack<> /堆棧, 后進(jìn)先出 System.Collecti

16、ons.Generic.LinkedList<>     /雙向鏈表System.Collections.Generic.LinkedListNode<> /LinkedList<> 的節(jié)點(diǎn) System.Collections.Generic.SynchronizedCollection<>         /線程安全的集合System.Collections.Generic.Synch

17、ronizedReadOnlyCollection<> /線程安全的只讀集合System.Collections.Generic.SynchronizedKeyedCollection<>    /線程安全的鍵/值集合 Dictionary<>、KeyValuePair<>:protected void Button1_Click(object sender, EventArgs e)    Dictionary<

18、;string, int> dict = new Dictionary<string, int>();    dict.Add("K1", 123);    dict"K2" = 456;    dict.Add("K3", 789);     string str = "&quo

19、t;    foreach (KeyValuePair<string, int> k in dict)            str += string.Format("0-1; ", k.Key, k.Value); /K1-123; K2-456; K3-789;      

20、0; TextBox1.Text = str; SortedDictionary<>:protected void Button1_Click(object sender, EventArgs e)    SortedDictionary<string, int> dict = new SortedDictionary<string, int>();    dict.Add("K3

21、", 333);    dict"K1" = 111;    dict.Add("K2", 222);     SortedDictionary<string, int>.KeyCollection ks = dict.Keys;    SortedDictionary<string, int>.ValueCollection vs

22、= dict.Values;     string s1, s2, s3;    s1 = s2 = s3 = ""     foreach (KeyValuePair<string, int> k in dict)            s1 +

23、= string.Format("0-1; ", k.Key, k.Value); /K1-111; K2-222; K3-333;         foreach (string s in ks) s2 += s + " "           /K1; K2; K3;  &#

24、160; foreach (int n in vs) s3 += n.ToString() + " "   /111; 222; 333;     TextBox1.Text = s1 + "n" + s2 + "n" + s3; SortedList<>:protected void Button1_Click(object

25、 sender, EventArgs e)    SortedList<string, int> dict = new SortedList<string, int>();    dict.Add("K3", 333);    dict"K1" = 111;    dict.Add("K2", 222);

26、     string s1, s2, s3;    s1 = s2 = s3 = ""     foreach (KeyValuePair<string, int> k in dict)            s1 += string.

27、Format("0-1; ", k.Key, k.Value); /K1-111; K2-222; K3-333;         s2 = dict.Keys0;              /K1    s3 = dict.Values0.ToString(); /111 &#

28、160;   TextBox1.Text = s1 + "n" + s2 + "n" + s3; HashSet<>、SortedSet<>:protected void Button1_Click(object sender, EventArgs e)    HashSet<string> hs = new HashSet<string>

29、();    hs.Add("ccc");    hs.Add("bbb");    hs.Add("aaa");     SortedSet<string> ss = new SortedSet<string>();    ss.Add("ccc"); 

30、   ss.Add("bbb");    ss.Add("aaa");     string s1 = "", s2 = ""     foreach (string s in hs) s1 += s + " "  /ccc bbb aaa

31、    foreach (string s in ss) s2 += s + " "  /aaa bbb ccc     TextBox1.Text = s1 + "n" + s2; List<>:protected void Button1_Click(object sender, EventArgs e)  &#

32、160; List<int> list = new List<int>();    list.Add(11);    list.Add(22);    list.Insert(0, 33);     string s1, s2 = "", s3, s4 = ""   

33、0; s1 = list0.ToString(); /33    for (int i = 0; i < list.Count; i+) s2 += listi.ToString() + " " /33 11 22     list.Sort();     s3 = list0.ToString(); /11    foreach&

34、#160;(int n in list) s4 += n.ToString() + " "  /11 22 33     TextBox1.Text = s1 + "n" + s2 + "n" + s3 + "n" + s4; LinkedList<>、LinkedListNode<>:protected void

35、 Button1_Click(object sender, EventArgs e)    LinkedList<string> list = new LinkedList<string>();    list.AddFirst("aaa");    list.AddLast("bbb");    list.AddFirst(&quo

36、t;ccc");    list.AddAfter(list.First, "ddd");    list.AddBefore(list.Last, "eee");     string s1 = "", s2 = "", s3 = "", s4 = "", s5 =&

37、#160;""     foreach (string s in list) s1 += s + " "  /ccc ddd aaa eee bbb     LinkedListNode<string> node = list.First;    s2 = node.Value.ToString();    

38、;     /ccc    node = node.Next;    s3 = node.Value.ToString();         /ddd    node = list.Last.Previous.Previous;    s4 = node.Value.ToString(); 

39、;        /aaa     list.Remove("eee");    list.RemoveFirst();    list.RemoveLast();     node = list.First;    while (node != null)&

40、#160;           s5 += node.Value.ToString() + " " /ddd aaa        node = node.Next;        TextBox1.Text = s1 + "n" + s2 +

41、60;"n" + s3 + "n" + s4 + "n" + s5;版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。目錄(?)+從使用的頻率一個(gè)個(gè)來(lái)簡(jiǎn)單說(shuō)一下。Array/ArrayList/List/LinkedListArray數(shù)組在C#中最早出現(xiàn)的。在內(nèi)存中是連續(xù)存儲(chǔ)的,所以它的索引速度非???,而且賦值與修改元素也很簡(jiǎn)單。csharp view plain copy 1. string s=new string2; 

42、  2.   3. /賦值   4. s0="a"   5. s1="b"   6. /修改   7. s1="a1"   但是數(shù)組存在一些不足的地方。在數(shù)組的兩個(gè)數(shù)據(jù)間插入數(shù)據(jù)是很麻煩的,而且在聲明數(shù)組的時(shí)候必須指定數(shù)組的長(zhǎng)度,數(shù)組的長(zhǎng)度過(guò)長(zhǎng),會(huì)造成內(nèi)存浪費(fèi),過(guò)段會(huì)造成數(shù)據(jù)溢出的錯(cuò)誤。如果在聲明數(shù)組時(shí)我們不清楚數(shù)組的長(zhǎng)度,就會(huì)變得很麻煩。針對(duì)數(shù)組

43、的這些缺點(diǎn),C#中最先提供了ArrayList對(duì)象來(lái)克服這些缺點(diǎn)。 底層數(shù)據(jù)結(jié)構(gòu)就是數(shù)組。ArrayListArrayList是命名空間System.Collections下的一部分,在使用該類時(shí)必須進(jìn)行引用,同時(shí)繼承了IList接口,提供了數(shù)據(jù)存儲(chǔ)和檢索。ArrayList對(duì)象的大小是按照其中存儲(chǔ)的數(shù)據(jù)來(lái)動(dòng)態(tài)擴(kuò)充與收縮的。所以,在聲明ArrayList對(duì)象時(shí)并不需要指定它的長(zhǎng)度。csharp view plain copy 1. ArrayList list1 = new ArrayList(); &#

44、160; 2.   3. /新增數(shù)據(jù)   4. list1.Add("cde");   5. list1.Add(5678);   6.   7. /修改數(shù)據(jù)   8. list2 = 34;   9.   10. /移除數(shù)據(jù)   11. list.RemoveAt(0);   

45、12.   13. /插入數(shù)據(jù)   14. list.Insert(0, "qwe");   從上面例子看,ArrayList好像是解決了數(shù)組中所有的缺點(diǎn),為什么又會(huì)有List?我們從上面的例子看,在List中,我們不僅插入了字符串cde,而且插入了數(shù)字5678。這樣在ArrayList中插入不同類型的數(shù)據(jù)是允許的。因?yàn)锳rrayList會(huì)把所有插入其中的數(shù)據(jù)當(dāng)作為object類型來(lái)處理,在我們使用ArrayList處理數(shù)據(jù)時(shí),很可能會(huì)報(bào)類型不匹配的錯(cuò)誤,也就是ArrayList不是類

46、型安全的。在存儲(chǔ)或檢索值類型時(shí)通常發(fā)生裝箱和取消裝箱操作,帶來(lái)很大的性能耗損。裝箱與拆箱的概念:簡(jiǎn)單的說(shuō):裝箱:就是將值類型的數(shù)據(jù)打包到引用類型的實(shí)例中比如將string類型的值abc賦給object對(duì)象objcsharp view plain copy 1. String i=”abc”;   2. object obj=(object)i;   拆箱:就是從引用數(shù)據(jù)中提取值類型比如將object對(duì)象obj的值賦給string類型的變量icsharp view plain&

47、#160;copy 1. object obj=”abc”;   2. string i=(string)obj;   裝箱與拆箱的過(guò)程是很損耗性能的。 底層數(shù)據(jù)結(jié)構(gòu)就是數(shù)組。類似于C+里面沒(méi)有泛型的Vector。泛型List因?yàn)锳rrayList存在不安全類型與裝箱拆箱的缺點(diǎn),所以出現(xiàn)了泛型的概念。List類是ArrayList類的泛型等效類,它的大部分用法都與ArrayList相似,因?yàn)長(zhǎng)ist類也繼承了IList接口。最關(guān)鍵的區(qū)別在于,在聲明List集合時(shí),我們同時(shí)需要為其聲明List集合

48、內(nèi)數(shù)據(jù)的對(duì)象類型。比如:csharp view plain copy 1. List<string> list = new List<string>();   2. /新增數(shù)據(jù)   3. list.Add(“abc”);   4. /修改數(shù)據(jù)   5. list0 = “def”;   6. /移除數(shù)據(jù)  

49、0;7. list.RemoveAt(0);   上例中,如果我們往List集合中插入int數(shù)組123,IDE就會(huì)報(bào)錯(cuò),且不能通過(guò)編譯。這樣就避免了前面講的類型安全問(wèn)題與裝箱拆箱的性能問(wèn)題了。底層數(shù)據(jù)結(jié)構(gòu)就是數(shù)組。類似于C+里面的Vector。LinkedList用雙鏈表實(shí)現(xiàn)的List,特點(diǎn)是插入刪除快,查找慢LinkedList<T> 提供 LinkedListNode<T> 類型的單獨(dú)節(jié)點(diǎn),因此插入和移除的運(yùn)算復(fù)雜度為 O(1)??梢砸瞥?jié)點(diǎn),然后在同一列表或其他列表中重新插入它們,這樣在堆中便不會(huì)分配額外的對(duì)象。由于該列表還維護(hù)內(nèi)部計(jì)

50、數(shù),因此獲取 Count 屬性的運(yùn)算復(fù)雜度為 O(1)。LinkedList<T> 對(duì)象中的每個(gè)節(jié)點(diǎn)都屬于 LinkedListNode<T> 類型。由于 LinkedList<T> 是雙向鏈表,因此每個(gè)節(jié)點(diǎn)向前指向 Next 節(jié)點(diǎn),向后指向 Previous 節(jié)點(diǎn)。csharp view plain copy 1. LinkedList<string> list = new LinkedList<string>();  2. list.AddF

51、irst("Data Value 1");  3. list.AddLast("Data Value 6");  關(guān)于List和LonkedList的一個(gè)性能比較增加 刪除在List<T>中增加、刪除節(jié)點(diǎn)的速度,大體上快于使用LinkedList<T>時(shí)的相同操作。將 List<T>.Add方法和LinkedList<T>的Add*方法相比較,真正的性能差別不在于Add操作,而在LinkedList<T>在給GC(垃

52、圾回收機(jī)制)的壓力上。一個(gè)List<T>本質(zhì)上是將其數(shù)據(jù)保存在一個(gè)堆棧的數(shù)組上,而LinkedList<T>是將其所有節(jié)點(diǎn)保存在堆棧上(人家是一個(gè),我是一系列)。這就使得GC需要更多地管理堆棧上LinkedList<T>的節(jié)點(diǎn)對(duì)象。注意,List<T>.Insert*方法比在LinkedList<T>中使用Add*方法在任何地方添加一個(gè)節(jié)點(diǎn)可能要慢。然而,這個(gè)依賴于List<T>插入對(duì)象的位置。Insert方法必須使所有在插入點(diǎn)后面的元素往后移動(dòng)一位。如果新元素被插在List<T>最后或接近最后的位置,那么相對(duì)

53、于GC維護(hù)LinkedList<T>節(jié)點(diǎn)的總的開銷來(lái)說(shuō),其開銷是可以被忽略的。索引另一個(gè)List<T>性能優(yōu)于LinkedList<T>的地方是你在使用索引進(jìn)行訪問(wèn)的時(shí)候。在List<T>中,你可以使用索引值(indexer)直接定位到某個(gè)具體的元素位置。而在LinkedList<T>中,卻沒(méi)有這樣的奢侈品。在LinkedList<T>中,你必須通過(guò)Previous或Next屬性遍歷整個(gè)List,直到找到你想要的節(jié)點(diǎn)。HashSet/HashTable/Dictionary這三個(gè)容器的底層都是Hash表。HashSetMS

54、DN很簡(jiǎn)單的解釋:表示值的集。HashSet<T> 類提供了高性能的集運(yùn)算。一組是一個(gè)集合,不包含任何重復(fù)的元素,且的元素順序不分先后。用了hash table來(lái)儲(chǔ)存數(shù)據(jù),是為了用O(n)的space來(lái)?yè)Q取O(n)的時(shí)間,也就是查找元素的時(shí)間是O(1)。它包含一些集合的運(yùn)算HashSet<T> 提供了許多數(shù)學(xué)設(shè)置操作例如,組添加 (聯(lián)合),并設(shè)置減法。下表列出了所提供 HashSet<T> 操作和及其數(shù)學(xué)等效項(xiàng)。UnionWith - Union 或?qū)⑵湓O(shè)置的添加IntersectWith - 交集ExceptWith - Se

55、t 減法SymmetricExceptWith - 余集列出的集操作中,除了 HashSet<T> 類還提供了方法來(lái)確定 set 是否相等、 重疊的集,以及一組是否為子集或另一個(gè)集的超集。examplecsharp view plain copy 1.  HashSet<int> evenNumbers = new HashSet<int>();  2. HashSet<int> oddNumbers = n

56、ew HashSet<int>();  3.   4. for (int i = 0; i < 5; i+)  5.   6.      / Populate numbers with just even numbers.  7.     &

57、#160; evenNumbers.Add(i * 2);  8.      / Populate oddNumbers with just odd numbers.  9.      oddNumbers.Add(i * 2) + 1);  10.   11.  / 

58、Create a new HashSet populated with even numbers.  12. HashSet<int> numbers = new HashSet<int>(evenNumbers);  13.  numbers.UnionWith(oddNumbers);  HashTable表示根據(jù)鍵的哈希代碼進(jìn)行組織的鍵/值對(duì)的集合。Hashtable是System.Co

59、llections命名空間提供的一個(gè)容器,用于處理和表現(xiàn)類似key/value的鍵值對(duì),其中key通??捎脕?lái)快速查找,同時(shí)key是區(qū)分大小寫;value用于存儲(chǔ)對(duì)應(yīng)于key的值。Hashtable中key/value鍵值對(duì)均為object類型,所以Hashtable可以支持任何類型的key/value鍵值對(duì).他內(nèi)部維護(hù)很多對(duì)Key-Value鍵值對(duì),其還有一個(gè)類似索引的值叫做散列值(HashCode),它是根據(jù)GetHashCode方法對(duì)Key通過(guò)一定算法獲取得到的,所有的查找操作定位操作都是基于散列值來(lái)實(shí)現(xiàn)找到對(duì)應(yīng)的Key和Value值的當(dāng)前HashTable中的被占用空間達(dá)到一個(gè)百分比的時(shí)候就將該空間自動(dòng)擴(kuò)容,在.net中這個(gè)百分比是72%,也叫.net中HashTable的填充因子為0.72。例如有一個(gè)HashTable

溫馨提示

  • 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)論