上次我們看到的StaffCollection和DepartmentCollection都是繼承于System.Collections.CollectionBase,那CollectionBase是個怎樣的類呢?
我們知道數組的定義是:連續配置設定的記憶體空間,大小不能被改變,是以如果我們需要一個像單向連結清單一樣可以動态添加元素的資料結構,我們就需要使用集合。
System.Collections.ArrayList一個動态的數組,從嚴格意義上講,說它是數組是不合适的,因為ArrayList一個重要的特征是,可以放入各種對象,該List是一個object的容器。
System.Collections.ArrayList提供了一組常用的屬性和方法:
屬性
方法
可包含的元素
Capacity
添加對象
Add、AddRange、Insert、InsertRange
實際包含的元素
Count
将容量設定為 ArrayList 中元素的實際數量
TrimToSize
是否具有固定大小
IsFixedSize
移除元素
Clear、Remove、RemoveAt、RemoveRange
是否為隻讀
IsReadOnly
比對搜尋
IndexOf、LastIndexOf
擷取或設定指定索引處的元素
Item
排序
Sort
将 ArrayList 的元素複制到新數組中
ToArray
1

System.Collections.ArrayList list = new System.Collections.ArrayList();
2

list.Add("hello");
3

list.Add(123);
4

list.Add(DateTime.Now);
5

for (int i = 0; i <= list.Count - 1; i++)
6
{
7
System.Console.WriteLine(list[i]);
8
}
以上的代碼運作起來,似乎沒有什麼奇特,螢幕上顯示出
hello
123
2007-2-13 8:54:12
不過,再進一步分析,list[i]所傳回的都是object類型。也就是說System.Console.WriteLine(list[i]);其實是System.Console.WriteLine(list[i].ToString());的簡略寫法。
你不可能通過list[2]傳回一個DateTime類型,并對該類型作日期加減處理(見前面的日期處理章節)。要傳回真正的類型,必須要做類型轉換。
我們來看看System.Console.WriteLine(list[i].GetType());的輸出
System.String
System.Int32
System.DateTime
我們來做一下變化

switch(list[i].GetType().ToString())
case "System.String":
System.Console.WriteLine(((string)list[i])+" C#");
break;
case "System.Int32":
9
System.Console.WriteLine(((int)list[i]) *4);
10
11
case "System.DateTime":
12
System.Console.WriteLine(((DateTime)list[i]).AddDays(15));
13
14
15
現在的運作結果就成了
hello C#
492
2007-2-28 9:01:17
如果傳回值是object類型的,就稱為弱類型,否則就是強類型。
是以說,ArrayList是一個弱類型的集合,該集合中可以放置所有的資料類型。這是不很安全。
是以我們往往需要自己編寫一個強類型的集合
.Net提供了一個用于編寫強類型集合的基類:System.Collections.CollectionBase
該類公開了集合中常用的,但和類型無關的操作:
Count、Clear 、RemoveAt
最最主要的是,它提供了一個protected的InnerList,該InnerList其實就是ArrayList,是以我們自己做的強類型集合,其實就是對ArrayList的包裝。昨天的代碼是對CollectionBase提供的protected的List操作,該List是一個IList接口實作(IList是List的傳回接口),功能比InnerList弱,如果你現在把昨天的代碼修改為使用InnerList,你會發現,你代碼可以少寫的多。InnerList傳回的是ArrayList的執行個體對象。
除了ArrayList集合,還有:
隊列Queue表示對象的先進先出集合

System.Collections.Queue q=new System.Collections.Queue();

for(int i=0;i<5;i++)
{
q.Enqueue(i);
}

System.Console.WriteLine(q.Peek());

while(q.Count>0)
System.Console.WriteLine(q.Dequeue());

System.Console.ReadLine();
代碼運作顯示
為什麼有兩個0呢?因為Peek 傳回位于 Queue 開始處的對象後不會移除該對象。
和Queue相反的是Stack,對象的簡單的後進先出集合(不是後進後出哦)
是以,代碼

System.Collections.Stack s = new System.Collections.Stack();

for (int i = 0; i < 5; i++)
s.Push(i);


s.Peek();

while (s.Count > 0)
System.Console.WriteLine(s.Pop());
運作的結果是
集合還有一個很重要的對象:哈希表,表示鍵/值對的集合。這個集合就是一個兩列的兩維表,第一清單示key,鍵是不可以重複的。
你可以檢查,
是否包含特定鍵:ContainsKey
是否包含特定值:ContainsValue

table.Add("Hello", "HELLO");

table.Add("HELLO", "HELLO");

table.Add("hello", "HELLO");
取值的時候,是根據鍵名稱取值
System.Console.WriteLine(table["hello"]);
本文轉自shyleoking 51CTO部落格,原文連結:http://blog.51cto.com/shyleoking/806274