寫在前面: 數組
最近在學習.Net的集合框架,看了許多博文,也看了書,總感受不是很明白。內心疑惑不少,天天鬱悶度日。若是學技術時感到很痛苦,有兩種可能,其一是學習方法不對;其二是真的不適合。但願大多數搞技術的朋友都不屬於後者。方法不對,那得找解決方法呀,因而乎網上一頓狂搜,也沒發現有價值的文章。一樣地,我搜索了一下Java的集合類,文章一堆,圖片更少滿天飛。而.Net連一張像樣的說明圖片都沒有,以爲微軟的技術老是藏着掖着,放佛怕人知道似的。不知道各位有沒有這樣的想法!? 框架
不過話又說回來,這樣也好,越是不想讓我知道,我就越想知道,本身總結出來的東西才記憶深入! 性能
上面這幅圖是Java的。 學習
下面就把這幾天的學習成果總結一下,與朋友們共享,有紕漏的地方還望指點! 測試
集合,表示能夠經過遍歷每一個元素來訪問的一組對象(特別是可以使用foreach循環訪問)。一個集合包括多個元素,即有一個集合類對象和N個元素對象。 ui
由於任何集合類都實現了IEnumerable接口,因此任何集合類對象都有一個GetEnumerator()方法,該方法能夠返回一個實現了 IEnumerator接口的對象,這個返回的IEnumerator對象既不是集合類對象,也不是集合的元素類對象,它是一個獨立的類對象。經過這個對象,能夠遍歷訪問集合類對象中的每個元素對象 spa
若是集合類是用戶自定義的集合類,則用戶必須實現它的GetEnumerator()方法,不然不能使用循環。固然,與這個自定義集合類對應的IEnumerator類(實現了該接口的類),也要自定義一個才行。 code
這張圖是用Reflector(這是個好東西)查看System.Collections命名空間。 orm
能夠看到,.Net Framework中的System.Collections命名空間下共有6個基本的集合類,分別是ArrayList,BitList,Hashtable,Queue,Stack以及SortedList。對象
1、ArrayList
ArrayList類是一個特殊的數組。經過添加和刪除元素,就能夠動態改變數組的長度。
ArrayList把全部元素都看成object對象引用,於是在訪問ArrayList的元素時要進行類型轉換。
隨着不斷向 ArrayList 中添加元素,容量經過從新分配按需自動增長,一般每次2倍的增長。若是須要創建一個對象數組,但不能預先知道數組的大小,就可使用ArrayList
優勢:動態改變大小、靈活方便的插入和刪除元素、可排序
缺點:插入時性能不如數組、不是強類型的
屬性或方法 |
描述 |
Count |
ArrayList中元素的個數 |
Capacity |
ArrayList中可包含的元素個數 |
Add() |
向ArrayList中添加一個對象返回int值 |
Clear() |
從ArrayList中移除全部元素 |
Contains() |
是否包含指定元素true/false |
IndexOf() |
返回指定對象第一次出現的索引值 |
Insert() |
在指定索引位置插入一個對象 |
Remove() |
移除指定對象的第一個匹配 |
RemoveAt() |
移除指定索引位置的對象 |
RemoveRange() |
從指定索引開始移除指定數量的元素 |
Sort() |
對ArrayList進行排序 |
TrimToSize() |
將Capacity設爲當前所包含元素的個數 |
ArrayList的主要屬性和方法
測試代碼:
1 ArrayList arrayList = new ArrayList(5);
2
3
4
5 arrayList.Add(1);
6
7 arrayList.Add("test");
8
9 arrayList.Add(3);
10
11 arrayList.Add("four");
12
13 arrayList.Add(5);
14
15 arrayList.Add(6);
16
17
18
19 arrayList.Remove(1);
20
21 try
22
23 {
24
25 arrayList.RemoveRange(0, 2);
26
27 }
28
29 catch (ArgumentException ae)
30
31 {
32
33 Console.WriteLine(ae.Message);
34
35 }
36
37
38
39 Console.WriteLine(arrayList.Count + "\t" + arrayList.Capacity);
40
41
42
43 arrayList.TrimToSize();
44
45
46
47 Console.WriteLine(arrayList.Count + "\t" + arrayList.Capacity + "\n");
48
49
50
51 IEnumerator enumrator = arrayList.GetEnumerator();
52
53 StringBuilder buffer = new StringBuilder();
54
55
56
57 while (enumrator.MoveNext())
58
59 {
60
61 buffer.Append(enumrator.Current + "\t");
62
63 }
64
65 Console.WriteLine(buffer);
66
67
68
69
70
71
72
73 foreach (var item in arrayList)
74
75 {
76
77 Console.WriteLine(item);
78
79 }
2、Stack
Stack是堆棧,後進先出的訪問各個元素。
能夠調用Stack對象的GetEnumerator()方法,獲得IEnumerator對象,來遍歷堆棧中的各個元素
屬性或方法 |
描述 |
Count |
Stack中元素的個數 |
Push() |
Stack中可包含的元素個數 |
Pop() |
向Stack中添加一個對象返回int值 |
Peek() |
從Stack中移除全部元素 |
Contains() |
Stack是否包含指定指定元素 |
Stack的主要屬性和方法
測試代碼:
1 Stack stack = new Stack();
2
3
4
5 stack.Push("first");
6
7 stack.Push("second");
8
9
10
11
12
13 Console.WriteLine("Count is : " + stack.Count);
14
15
16
17 Console.WriteLine("Top is: " + stack.Peek());
18
19
20
21 stack.Pop(); // second pop
22
23
24
25 stack.Pop(); // first pop
26
27
28
29 try
30
31 {
32
33 stack.Pop(); // Pop() 引起 InvalidOperationException異常
34
35 }
36
37 catch (InvalidOperationException ex)
38
39 {
40
41 Console.WriteLine(ex.Message);
42
43 }
44
45
46
47 IEnumerator enumrator = stack.GetEnumerator();
48
49 StringBuilder buffer = new StringBuilder();
50
51
52
53 while (enumrator.MoveNext())
54
55 {
56
57 buffer.Append(enumrator.Current + "\t");
58
59 }
60
61 Console.WriteLine(buffer);
3、哈希表,Hashtable
在.NET Framework中,Hashtable是System.Collections命名空間提供的一個容器,用於處理和表現相似key/value的鍵值對,其中key一般可用來快速查找,同時key是區分大小寫;value用於存儲對應於key的值。Hashtable中key/value鍵值對均爲object類型,因此Hashtable能夠支持任何類型的key/value鍵值對.
屬性或方法 |
描述 |
Count |
返回Hashtable中元素的個數 |
Add() |
向Hashtable中添加元素 |
Clear() |
向Hashtable中移除全部元素 |
Remove(key) |
從Hashtable中移除指定的元素 |
Contains() |
Hashtable是否包含指定指定元素 |
測試代碼: |
1 // 建立一個Hashtable實例
2
3 Hashtable ht = new Hashtable();
4
5 // 添加key/value鍵值對
6
7 ht.Add("E", "e");
8
9 ht.Add("A", "a");
10
11 ht.Add("C", "c");
12
13 ht.Add("B", "b");
14
15
16
17 // 判斷哈希表是否包含特定鍵值,其返回值爲true或false
18
19 if (ht.ContainsKey("E"))
20
21 {
22
23 Console.WriteLine("The key E exists.");
24
25 }
26
27
28
29 //ht.Remove("C"); // 移除一個key/value鍵值對
30
31 Console.WriteLine(ht["A"]); // 利用索引 此處輸出a
32
33
34
35 //ht.Clear(); // 移除hashtable中的全部key/value鍵值對
36
37
38
39 //Console.WriteLine(ht["A"]); // 此處不會有任何輸出,由於全部的元素都被清空了
40
41
42
43 // 遍歷哈希表
44
45 foreach(DictionaryEntry de in ht)
46
47 {
48
49 Console.Write(de.Key + ":");
50
51 Console.WriteLine(de.Value);
52
53 }
54
55
56
57 // 對哈希表進行排序
58
59 // 哈希表中key按必定規則排序,實際上這是不可能實現的,由於哈希表中存放的是key/value鍵值對
60
61 // 因此須要採起一種變通的的作法
62
63 ArrayList al = new ArrayList(ht.Keys);
64
65
66
67 al.Sort(); // 按字母順序進行排序
68
69
70
71 Console.WriteLine("After Sorted:");
72
73
74
75 // 排序後輸出
76
77 foreach (string skey in al)
78
79 {
80
81 Console.Write(skey + ":");
82
83 Console.WriteLine(ht[skey]);
84
85 }
86
87 //string s = (string)ht["A"];//須要拆箱
4、SortedList
SortedLIst兼顧了ArrayList和Hashtable的優勢,可按鍵值來排序。
SortedLIst表示key/value鍵值對的集合,與哈希表相似,區別在於SortedList中的key是排好序的數組。
測試代碼:
1 SortedList sl = new SortedList();
2
3 sl["c"] = 41;
4
5 sl["a"] = 42;
6
7 sl["b"] = 11;
8
9 sl["d"] = 13;
10
11
12
13 Console.WriteLine("這是從SortedList裏輸出的:");
14
15 foreach (DictionaryEntry de in sl)
16
17 {
18
19 string s = (string)de.Key;
20
21 int i = (int)de.Value;
22
23 Console.WriteLine("{0},{1}", s, i);
24
25 }
完畢!