先來了解下集合的基本信息
1、BCL中集合類型分為泛型集合與非泛型集合。
2、非泛型集合的類和接口位於System.Collections命名空間。
3、泛型集合的類和接口位於System.Collections.Generic命名空間。
ICollection接口是System.Collections命名空間中非泛型集合類的基接口,它繼承自IEnumerable接口,從IEnumerable接口繼承意味著實現該接口的實現類需要實現一個枚舉器方法:GetEnumerator,該方法返回IEnumerator類型的數據。IDictionary和IList接口繼承自ICollection作為更為專用的接口,其中IDictionary接口是鍵/值對接口,它的實現如HashTable類;而IList是值的集合,其成員可通過索引訪問,如ArrayList類,次類集合與數組相比,可以認為是可變的集合,優點有,長度自動增長等。IEnumerable<T>和IEnumerable是所有集合或集合接口的基接口,所有集合接口或集合都繼承、實現了它。其中IEnumerable是最底層的接口。在非泛型集合裡存放的都是System.Object類型。
一、下面列出非泛型和泛型集合的接口
非泛型集合接口 泛型集合接口 說明
ICollection ICollection<T> 定義所有集合的大小(Count),枚舉器(foreach)和同步(copyto)方法,繼承自IEnumerable
IList IList<T> 表示可按照索引單獨訪問的一組對象(像數組一樣)
IDictionary IDictionary<T> 表示鍵/值對的集合
IComparer IComparer<T> 定義類型為比較兩個對象而實現的方法
IEqualityComparer IEqualityComparer<T> 定義方法以支持對象的相等比較
IEnumerable IEnumerable<T> 公開枚舉器。實現了該接口意味著允許foreach語句循環訪問集合中的元素
IEnumerator IEnumerator<T> 支持在泛型集合上進行簡單迭代
下面來詳細介紹各種集合接口和集合。個人認為應該從根底說起。
先抱著MSDN來說IEnumerable,擴展方法就不說了,擴展方法跳過,留到學Linq的時候再說。
1、IEnumerable接口就一個方法,沒有屬性。
方法 說明
GetEnumerator 返回一個循環訪問集合的枚舉數。 實現或繼承了該接口,就是為了這個方法,可以foreach遍歷。
2、IEnumerable<T>接口也一樣,也是就一個方法,沒有屬性。
方法 說明
GetEnumerator 返回一個循環訪問集合的枚舉數。
3、ICollection接口
方法 說明
CopyTo 從特定的 Array 索引處開始,將 ICollection 的元素復制到一個 Array 中。
GetEnumerator 返回一個循環訪問集合的枚舉數。 (繼承自 IEnumerable。)
屬性
Count 獲取 ICollection 中包含的元素數。 原來Count的源頭在這裡。
IsSynchronized 獲取一個值,該值指示是否同步對 ICollection 的訪問(線程安全)。
SyncRoot 獲取可用於同步 ICollection 訪問的對象。
4、ICollection<T>
方法 說明
Count 獲取 ICollection<(Of <(T>)>) 中包含的元素數。
IsReadOnly 獲取一個值,該值指示 ICollection<(Of <(T>)>) 是否為只讀。
屬性
Add 將某項添加到 ICollection<(Of <(T>)>) 中。
Clear 從 ICollection<(Of <(T>)>) 中移除所有項。
Contains 確定 ICollection<(Of <(T>)>) 是否包含特定值。
CopyTo 從特定的 Array 索引開始,將 ICollection<(Of <(T>)>) 的元素復制到一個 Array 中。
GetEnumerator 已重載。
Remove 從 ICollection<(Of <(T>)>) 中移除特定對象的第一個匹配項。
這個ICollect<T>,才開始有點集合的影子了,可以Add、Clear了,怪不得它作為泛型集合接口的基類。
5、IList
IList繼承了ICollection和IEnumerable
方法 說明
Add 將某項添加到 IList 中。
Clear 從 IList 中移除所有項。
Contains 確定 IList 是否包含特定值。
CopyTo 從特定的 Array 索引處開始,將 ICollection 的元素復制到一個 Array 中。 (繼承自 ICollection。)
GetEnumerator 返回一個循環訪問集合的枚舉數。 (繼承自 IEnumerable。)
IndexOf 確定 IList 中特定項的索引。
Insert 將一個項插入指定索引處的 IList。
Remove 從 IList 中移除特定對象的第一個匹配項。
RemoveAt 移除指定索引處的 IList 項。
屬性
Count 獲取 ICollection 中包含的元素數。 (繼承自 ICollection。)
IsFixedSize 獲取一個值,該值指示 IList 是否具有固定大小。
IsReadOnly 獲取一個值,該值指示 IList 是否為只讀。
IsSynchronized 獲取一個值,該值指示是否同步對 ICollection 的訪問(線程安全)。 (繼承自 ICollection。)
Item 獲取或設置指定索引處的元素。
SyncRoot 獲取可用於同步 ICollection 訪問的對象。 (繼承自 ICollection。)
可以看到,在不斷的繼承過程中,這些接口不斷地添加自己的東西,越繼承越多,越繼承越多。
6、IList<T>
IList<T>繼承了ICollection<T>,IEnumerable<T>,IEnumerable
方法 說明
Add 將某項添加到 ICollection<(Of <(T>)>) 中。 (繼承自 ICollection<(Of <(T>)>)。)
Clear 從 ICollection<(Of <(T>)>) 中移除所有項。 (繼承自 ICollection<(Of <(T>)>)。)
Contains 確定 ICollection<(Of <(T>)>) 是否包含特定值。 (繼承自 ICollection<(Of <(T>)>)。)
CopyTo 從特定的 Array 索引開始,將 ICollection<(Of <(T>)>) 的元素復制到一個 Array 中。 (繼承自 ICollection<(Of <(T>)>)。)
GetEnumerator 已重載。
IndexOf 確定 IList<(Of <(T>)>) 中特定項的索引。
Insert 將一個項插入指定索引處的 IList<(Of <(T>)>)。
Remove 從 ICollection<(Of <(T>)>) 中移除特定對象的第一個匹配項。 (繼承自 ICollection<(Of <(T>)>)。)
RemoveAt 移除指定索引處的 IList<(Of <(T>)>) 項。
屬性
Count 獲取 ICollection<(Of <(T>)>) 中包含的元素數。 (繼承自 ICollection<(Of <(T>)>)。)
IsReadOnly 獲取一個值,該值指示 ICollection<(Of <(T>)>) 是否為只讀。 (繼承自 ICollection<(Of <(T>)>)。)
Item 獲取或設置指定索引處的元素。
同樣,在不斷的繼承中,增加了新的東西,功能也越來越強大,支持索引獲取和設置就是IList<T>這個源頭的。一直弄不明白,NHibernate為什麼會選擇這個接口來返回數據,其實這個接口的東西夠用了。
7、IDictionary<TKey,TValue>接口
IDictionary<TKey,TValue>是最底層出現的鍵/值對集合了,相當於值集合中的ICollection<T>
方法 說明
Add 已重載。
Clear 從 ICollection<(Of <(T>)>) 中移除所有項。 (繼承自 ICollection<(Of <(T>)>)。)
Contains 確定 ICollection<(Of <(T>)>) 是否包含特定值。 (繼承自 ICollection<(Of <(T>)>)。)
ContainsKey 確定 IDictionary<(Of <(TKey, TValue>)>) 是否包含具有指定鍵的元素。
CopyTo 從特定的 Array 索引開始,將 ICollection<(Of <(T>)>) 的元素復制到一個 Array 中。 (繼承自 ICollection<(Of <(T>)>)。)
GetEnumerator 已重載。
Remove 已重載。
TryGetValue 獲取與指定的鍵相關聯的值。
屬性
Count 獲取 ICollection<(Of <(T>)>) 中包含的元素數。 (繼承自 ICollection<(Of <(T>)>)。)
IsReadOnly 獲取一個值,該值指示 ICollection<(Of <(T>)>) 是否為只讀。 (繼承自 ICollection<(Of <(T>)>)。)
Item 獲取或設置具有指定鍵的元素。
Keys 獲取包含 IDictionary<(Of <(TKey, TValue>)>) 的鍵的 ICollection<(Of <(T>)>)。
Values 獲取包含 IDictionary<(Of <(TKey, TValue>)>) 中的值的 ICollection<(Of <(T>)>)。
該接口提供的功能和ICollection<T>差不多,其實就是鍵/值對的開宗立派者。
8、IDictionary
方法 說明
Add 在 IDictionary 對象中添加一個帶有所提供的鍵和值的元素。
Clear 從 IDictionary 對象中移除所有元素。
Contains 確定 IDictionary 對象是否包含具有指定鍵的元素。
CopyTo 從特定的 Array 索引處開始,將 ICollection 的元素復制到一個 Array 中。 (繼承自 ICollection。)
GetEnumerator 已重載。
Remove 從 IDictionary 對象中移除帶有指定鍵的元素。
屬性
Count 獲取 ICollection 中包含的元素數。 (繼承自 ICollection。)
IsFixedSize 獲取一個值,該值指示 IDictionary 對象是否具有固定大小。
IsReadOnly 獲取一個值,該值指示 IDictionary 對象是否為只讀。
IsSynchronized 獲取一個值,該值指示是否同步對 ICollection 的訪問(線程安全)。 (繼承自 ICollection。)
Item 獲取或設置具有指定鍵的元素。
Keys 獲取 ICollection 對象,它包含 IDictionary 對象的鍵。
SyncRoot 獲取可用於同步 ICollection 訪問的對象。 (繼承自 ICollection。)
Values 獲取 ICollection 對象,它包含 IDictionary 對象中的值。
9、ISet<T>
ISet<T>同樣是繼承自ICollection<T>,IEnumerable<T>,IEnumerable
方法 說明
Add(T) 將某項添加到 ICollection<T> 中。 (繼承自 ICollection<T>。)
Add(T) 向當前集內添加元素,並返回一個指示是否已成功添加元素的值。
Clear 從 ICollection<T> 中移除所有項。 (繼承自 ICollection<T>。)
Contains 確定 ICollection<T> 是否包含特定值。 (繼承自 ICollection<T>。)
CopyTo 從特定的 Array 索引開始,將 ICollection<T> 的元素復制到一個 Array 中。 (繼承自 ICollection<T>。)
ExceptWith 從當前集內移除指定集合中的所有元素。
GetEnumerator() 返回一個循環訪問集合的枚舉數。 (繼承自 IEnumerable。)
GetEnumerator() 返回一個循環訪問集合的枚舉器。 (繼承自 IEnumerable<T>。)
IntersectWith 修改當前集,使該集僅包含指定集合中也存在的元素。
IsProperSubsetOf 確定當前的設置是否正確 (嚴格) 指定集合的子集。
IsProperSupersetOf 確定當前的設置是否正確 (嚴格) 指定集合中的超集。
IsSubsetOf 確定一個集是否為指定集合的子集。
IsSupersetOf 確定當前集是否為指定集合的超集。
Overlaps 確定當前集是否與指定的集合重疊。
Remove 從 ICollection<T> 中移除特定對象的第一個匹配項。 (繼承自 ICollection<T>。)
SetEquals 確定當前集與指定的集合中是否包含相同的元素。
SymmetricExceptWith 修改當前集,使該集僅包含當前集或指定集合中存在的元素(但不可包含兩者共有的元素)。
UnionWith 修改當前設置,以使其包含當前集或指定的集合中的所有元素。
記住這些接口之間的關系,其實是非常重要的,方法和屬性記不全也無所謂,但是需要記住各自提供的功能,以及繼承關系。
先說IComparer接口,這個接口就一個方法,用於如何比較兩個對象
public class StringLengthComparer : IComparer<string> { public int Compare(string s1, string s2) { if (s1.Length > s2.Length) { return (1); } else if (s1.Length < s2.Length) { return (2); } else { return (0); } } }
說完了集合接口,現在開始說集合。
1、ArrayList
ArrayList實現了IList、ICollection、IEnumerable接口。
ArrayList與Array的名字很相似,現在來比較一下兩者的異同。
相同點:
(1)、兩者都實現了IList、ICollection、IEnumerable接口。
(2)、兩者都可以使用整數索引訪問集合中的元素,包括讀取和賦值,且集合中的索引都從0開始。
不同點:
(1)、ArrayList是集合,而Array是數組。
(2)、ArrayList是具體類,Array是抽象類。
(3)、數組必須在實例化時指定元素的數量,該數量一旦確定就不可以更改了,而ArrayList擴展了這一點,當實例化一個ArrayList實例時可以不指定集合元素數(有默認初始容量),當然你也可以指定初始容量。
(4)、獲取數組的元素數時使用Length屬性,而獲取ArrayList集合的元素數時使用Count屬性。
(5)、數組可以有多維,而ArrayList只能是一維。
來看ArrayList具體提供的功能
屬性 說明
Capacity 獲取或設置 ArrayList 可包含的元素數。
Count 獲取 ArrayList 中實際包含的元素數。
IsFixedSize 獲取一個值,該值指示 ArrayList 是否具有固定大小。
IsReadOnly 獲取一個值,該值指示 ArrayList 是否為只讀。
IsSynchronized 獲取一個值,該值指示是否同步對 ArrayList 的訪問(線程安全)。
Item 獲取或設置指定索引處的元素。
SyncRoot 獲取可用於同步 ArrayList 訪問的對象。
方法
Adapter 為特定的 IList 創建 ArrayList 包裝。
Add 將對象添加到 ArrayList 的結尾處。
AddRange 將 ICollection 的元素添加到 ArrayList 的末尾。
BinarySearch 已重載。 使用對分檢索算法在已排序的 ArrayList 或它的一部分中查找特定元素。
Clear 從 ArrayList 中移除所有元素。
Clone 創建 ArrayList 的淺表副本。
Contains 確定某元素是否在 ArrayList 中。
CopyTo 已重載。 將 ArrayList 或它的一部分復制到一維數組中。
FixedSize 已重載。 返回具有固定大小的列表包裝,其中的元素允許修改,但不允許添加或移除。
GetEnumerator 已重載。 返回循環訪問 ArrayList 的枚舉數。
GetRange 返回 ArrayList,它表示源 ArrayList 中元素的子集。
IndexOf 已重載。 返回 ArrayList 或它的一部分中某個值的第一個匹配項的從零開始的索引。
Insert 將元素插入 ArrayList 的指定索引處。 可在任意位置插入。
InsertRange 將集合中的某個元素插入 ArrayList 的指定索引處。
LastIndexOf 已重載。 返回 ArrayList 或它的一部分中某個值的最後一個匹配項的從零開始的索引。
ReadOnly 已重載。 返回只讀的列表包裝。
Remove 從 ArrayList 中移除特定對象的第一個匹配項。
RemoveAt 移除 ArrayList 的指定索引處的元素。
RemoveRange 從 ArrayList 中移除一定范圍的元素。
Repeat 返回 ArrayList,它的元素是指定值的副本。
Reverse 已重載。 將 ArrayList 或它的一部分中元素的順序反轉。
SetRange 將集合中的元素復制到 ArrayList 中一定范圍的元素上。
Sort 已重載。 對 ArrayList 或它的一部分中的元素進行排序。
Synchronized 已重載。 返回同步的(線程安全)列表包裝。
ToArray 已重載。 將 ArrayList 的元素復制到新數組中。
TrimToSize 將容量設置為 ArrayList 中元素的實際數目。
static void Main(string[] args) { ArrayList arrayList = new ArrayList(); arrayList.Add(1); //Add方法,將一個元素添加到ArrayList中 arrayList.Add("你好"); arrayList.Add(3.265); IList iList = arrayList; ICollection iCollection = iList; IEnumerable iEnumerable = iCollection; //體現了ArrayList的繼承關系 foreach (object obj in iEnumerable) { Console.WriteLine(obj.ToString()); } bool b = arrayList.Contains("你好"); //確定ArrayList中是否包含某元素 Console.WriteLine(b); //輸出 True object[] objArr = new object[arrayList.Count + 1]; objArr[0] = "我是用來占位的"; arrayList.CopyTo(objArr, 1); //便宜一位,也就是接受數組從1開始,默認是0 foreach (object obj in objArr) { Console.Write(obj.ToString() + "-"); //輸出 我是用來占位的-1-你好-3.265- } Console.WriteLine(); ArrayList AL = ArrayList.FixedSize(arrayList); //靜態方法 返回一個固定大小的ArrayList對象,數量不許改變。也就是說不能添加和刪除。 Console.WriteLine(AL.IsFixedSize); //輸出True //AL.Add(111); 此處報異常,"集合的大小是固定的" ArrayList ALReadOnly = ArrayList.ReadOnly(arrayList); Console.WriteLine(ALReadOnly.IsReadOnly); //輸出True ArrayList AL1 = arrayList.GetRange(1, 2); //按照索引順序截取出子集 foreach (object obj in AL1) { Console.Write(obj.ToString()); //輸出 你好3.265 可以截取出的新ArrayList只包含1,2位 } Console.WriteLine(); int indexLocation = arrayList.IndexOf(1); //從左邊開始檢索,返回第一個匹配到的元素的順序 Console.WriteLine(indexLocation); //輸出 0 arrayList.Add(1); //為了體現LastIndexOf的不同,先添加一個1 int lastLocation = arrayList.LastIndexOf(1); Console.WriteLine(lastLocation); //返回3 arrayList.Insert(2, "Insert插入的元素"); //這個方法與Add的不同在於它可以在任意位置插入 foreach (object obj in arrayList) { Console.Write(obj.ToString() + " "); //輸出 1 你好 Insert插入的元素 3.265 1 } ArrayList arr = new ArrayList(); arr.Add(1); arr.Add(2); arrayList.AddRange(arr); foreach (object obj in arrayList) { Console.Write(obj.ToString() + "-"); //輸出 1 你好 Insert插入的元素 3.265 1 1 2可以看到將一個新的集合追加到了最後 } arrayList.Remove(2); foreach (object obj in arrayList) { Console.Write(obj.ToString() + "-"); //輸出 1 你好 Insert插入的元素 3.265 1 1 可以看到2已經被移除了 } Console.WriteLine(); arrayList.RemoveAt(0); foreach (object obj in arrayList) { Console.Write(obj.ToString() + "-"); //輸出 你好 Insert插入的元素 3.265 1 1 可以看到第0個元素"2"已經被移除了 } Console.WriteLine(); //arrayList.Reverse(); //foreach (object obj in arrayList) //{ // Console.Write(obj.ToString() + "-"); //輸出順序倒轉的所有元素 //} ArrayList AL3 = new ArrayList(); arrayList.SetRange(0,AL3); //從第0位開始,將元素復制到AL3中 foreach (object obj in AL3) { Console.Write(obj.ToString() + "-"); //輸出 你好 Insert插入的元素 3.265 1 1 } object[] objArrs = new object[arrayList.Count]; objArrs = arrayList.ToArray(); foreach (object obj in objArrs) { Console.Write(obj.ToString() + "-"); } Console.WriteLine(); arrayList.Capacity = 5; //讀取或設置可包含元素的數量,如果小於當前會報錯。 Console.WriteLine(arrayList.Count); //輸出5 arrayList.TrimToSize(); Console.WriteLine(arrayList.Count); //輸出5 Console.ReadKey(); }
2、非泛型集合HashTable
Hashtable實現了IDictionary、ICollection以及IEnumerable接口。注意Hashtable,t是小寫的。由於是非泛型集合,因此存儲進去的都是object類型,不管是鍵還是值。
Hashtable的要點。
(1)、Hashtable僅有非泛型版本。
(2)、Hashtable類中的鍵不允許重復,但值可以。
(3)、Hashtable類所存儲的鍵值對中,值可以為null,但鍵不允許為null。
(4)、Hashtable不允許排序操作。
以下給出一個實例,Hashtable提供的功能是在於ArraryList差不多,只不過存儲的是鍵值對而已。只寫個基本短小的示例。
static void Main(string[] args) { Hashtable ht = new Hashtable(); ht.Add(1,1); ht.Add("我愛你","是嗎?"); Console.WriteLine(ht.Count); //輸出 2 Console.WriteLine(ht["我愛你"]); //輸出 "是嗎?" 用鍵 獲取值 Console.WriteLine(ht.Contains(1)); //輸出True Console.ReadKey(); }
3、Queue和Queue<T>
Queue成為隊列,隊列是這樣一種數據結構,數據有列表的一端插入,並由列表的另一端移除。就像單行道,只能從一段進,從一端出。Queue類實現了ICollection和IEnumerable接口。
Queue的一些重要特性。
1、先進先出
2、可以添加null值到集合中
3、允許集合中的元素重復
4、Queue容量會按需自動添加
5、Queue的等比因子是當需要更大容量時當前容量要乘以的數字,默認是2.0。
現在列出Queue一個特性的功能
成員 類型 說明
Clear 方法 從Queue中移除所有對象,清空隊列。
Contains 方法 確定某元素是否在Queue中
Enqueue 方法 將對象添加到Queue的結尾處 入列
Dequeue 方法 移除並返回位於Queue開始處的對象 出列
Peek 方法 返回位於Queue開始出的對象,但不將其移除,與出列不同,出列是會移除的
提供的功能都是差不多的,現在給出一個實例,主要顯示Queue的作用。
static void Main(string[] args) { Queue q = new Queue(); q.Enqueue(1); q.Enqueue("想家了!"); q.Enqueue(1.23); Console.WriteLine(q.Peek()); //輸出1 獲取值但不移除,與出列不同 int Count = q.Count; //出隊的時候q.Count在變化,因此q.Count放在循環條件裡是不妥的 for (int i = 0; i < Count; i++) { Console.WriteLine(q.Dequeue().ToString()); //注意 輸出 1 想家了 1.23 都是從最先添加的先拿 } Console.WriteLine(q.Count); //輸出0 出列一次,就自動移除了。 Queue<int> qInt = new Queue<int>(); qInt.Enqueue(1); qInt.Enqueue(2); qInt.Enqueue(3); Console.WriteLine(qInt.Peek()); //輸出1 int IntCount = qInt.Count; for (int i = 0; i < IntCount; i++) { Console.WriteLine(qInt.Dequeue()); //注意 輸出 123 都是從最先添加的先拿 } Console.WriteLine(q.Count); //輸出0 出列一次,就自動移除了。 Console.ReadKey(); }
4、Stack和Stack<T>
Stack稱為棧,棧和隊列非常相似,只不過隊列是先進先出,而棧中的數據添加和移除都在一端進行,遵守棧中的數據則後進先出。Stack類實現了ICollection和IEnumerable接口。
Stack類的一些重要特性如下:
1、後進先出。
2、可以添加null值到集合中。
3、允許集合中的元素重復。
4、Stack的容量會按需自動增加。
列出幾個有特點的功能。
成員 類型 說明
Clear 方法 從Stack中移除所有對象
Contains 方法 確定某元素是否在Stack中
Push 方法 將對象插入Stack的頂部 入棧
Pop 方法 移除並返回Stack頂部的對象 出棧
Peek 方法 返回位於Stack頂部的對象,但不移除,注意出棧是移除的。它不移除僅僅返回。
Count 屬性 獲取Stack中包含的元素
static void Main(string[] args) { Stack s = new Stack(); s.Push(1); s.Push("想回家了!"); s.Push(1.23); Console.WriteLine(s.Peek()); //輸出1.23 int Count = s.Count; //差點犯了邏輯錯誤,在for裡面如果是s.Count的話,很容易亂,因為出棧操作s.Count是在變動著的。 for (int i = 0; i < Count; i++) { Console.WriteLine(s.Pop()); //輸出 1.23 想回家了 1 } Console.WriteLine(s.Count); //輸出0 Stack<int> sInt = new Stack<int>(); sInt.Push(1); sInt.Push(2); sInt.Push(3); Console.WriteLine(sInt.Peek()); //輸出3 int IntCount = sInt.Count; //差點犯了邏輯錯誤,在for裡面如果是s.Count的話,很容易亂,因為出棧操作s.Count是在變動著的。 for (int i = 0; i < IntCount; i++) { Console.WriteLine(sInt.Pop()); //輸出 3 2 1 } Console.WriteLine(sInt.Count); //輸出0 Console.ReadKey(); }
5、SortedList與SortedList<T>
SortedList類實現了IDictionary、ICollection以及IEnumerable接口。SortedList類與HashTable類似,也表示一個鍵/值對集合,可以通過鍵和索引對元素進行訪問,但不同的是,也是該類的最大作用所在,就是支持基於鍵的排序。在SortedList中,鍵和值分別保存在一個數組中,當向Sorted添加一個元素時,SortedList類添加一個元素時,SortedList會首先對key進行排序,然後根據排序結果計算出要插入到集合中的位置索引,再分別將key和value插入到各自數組的指定索引位置。當使用foreach循環集合中的元素時,SortedList會將相同索引位置的key和value放進一個DictionaryEntry類型的對象,然後返回。
看了下MSDN,功能還是差不多,而且不難看明白,實在沒力氣一個一個寫DEMO了。
static void Main(string[] args) { SortedList SL = new SortedList(); SL.Add("txt","txt"); //Add的時候會自動排序 SL.Add("jpg","jpg"); SL.Add("png","png"); foreach (DictionaryEntry de in SL) //返回的是DictionaryEntry對象 { Console.Write(de.Key + ":" + de.Value + " "); //輸出 jpg:jpg png:png txt:txt //注意這個順序啊,添加的時候就自動排序了 } Console.WriteLine(); SortedList<int,string> SLString = new SortedList<int,string>(); SLString.Add(3, "333"); SLString.Add(2, "222"); SLString.Add(1, "111"); foreach (KeyValuePair<int,string> des in SLString) //返回的是KeyValuePair,在學習的時候盡量少用var,起碼要知道返回的是什麼 { Console.Write(des.Key + ":" + des.Value + " "); } Console.ReadKey(); }
6、BitArray
BitArray類實現了一個位結構,它是一個二進制位(0和1)的集合。BitArray的值表示true或false。true表示位打開,false表示位關閉。BitArray實現了ICollection和IEnumerable接口。
BitArray的一些特性如下:
1、BitArray集合不支持動態調整,因此沒有Add和Remove方法。
2、若需要調整集合的大小,可通過設置屬性Length的值來實現。
3、集合中的索引從0開始。
4、使用BitArray(int length)構造函數初始化BitArray集合後,其值均為false。
5、BitArray集合之間支持按位“或”、“異或”、“與運算”,參與這三類運算的BitArray集合長度必須相等。否則會拋出異常。
抱著MSDN來學習下:
屬性 說明
Count 獲取 BitArray 中包含的元素數。
IsReadOnly 獲取一個值,該值指示 BitArray 是否為只讀。
IsSynchronized 獲取一個值,該值指示是否同步對 BitArray 的訪問(線程安全)。
Item 獲取或設置 BitArray 中特定位置的位的值。
Length 獲取或設置 BitArray 中元素的數目。
SyncRoot 獲取可用於同步 BitArray 訪問的對象。
方法 說明
And 對當前 BitArray 中的元素和指定的 BitArray 中的相應元素執行按位 AND 運算。
Clone 創建 BitArray 的淺表副本。
CopyTo 從目標數組的指定索引處開始將整個 BitArray 復制到兼容的一維 Array。
Get 獲取 BitArray 中特定位置處的位的值。
GetEnumerator 返回循環訪問 BitArray 的枚舉數。
Not 反轉當前 BitArray 中的所有位值,以便將設置為 true 的元素更改為 false;將設置為 false 的元素更改為 true。
Or 對當前 BitArray 中的元素和指定的 BitArray 中的相應元素執行按位“或”運算。
Set 將 BitArray 中特定位置處的位設置為指定值。
SetAll 將 BitArray 中的所有位設置為指定值。
Xor 對當前 BitArray 中的元素和指定的 BitArray 中的相應元素執行按位“異或”運算。
static void Main(string[] args) { BitArray BA = new BitArray(3); BA[0] = true; BA[1] = false; BA[2] = true; BitArray BB = new BitArray(3); BA[0] = true; BA[1] = false; BA[2] = true; BitArray BOr = BA.Or(BB); //與運算,返回一個新的BitArray foreach (var b in BOr) { Console.Write(b + "-"); //True-False-True } Console.ReadKey(); }