先來了解下集合的基本信息html
一、BCL中集合類型分爲泛型集合與非泛型集合。算法
二、非泛型集合的類和接口位於System.Collections命名空間。數組
三、泛型集合的類和接口位於System.Collections.Generic命名空間。安全
ICollection接口是System.Collections命名空間中非泛型集合類的基接口,它繼承自IEnumerable接口,從IEnumerable接口繼承意味着實現該接口的實現類須要實現一個枚舉器方法:GetEnumerator,該方法返回IEnumerator類型的數據。IDictionary和IList接口繼承自ICollection做爲更爲專用的接口,其中IDictionary接口是鍵/值對接口,它的實現如HashTable類;而IList是值的集合,其成員可經過索引訪問,如ArrayList類,次類集合與數組相比,能夠認爲是可變的集合,優勢有,長度自動增加等。IEnumerable<T>和IEnumerable是全部集合或集合接口的基接口,全部集合接口或集合都繼承、實現了它。其中IEnumerable是最底層的接口。在非泛型集合裏存放的都是System.Object類型。數據結構
1、下面列出非泛型和泛型集合的接口函數
非泛型集合接口 泛型集合接口 說明學習
ICollection ICollection<T> 定義全部集合的大小(Count),枚舉器(foreach)和同步(copyto)方法,繼承自IEnumerablespa
IList IList<T> 表示可按照索引單獨訪問的一組對象(像數組同樣)線程
IDictionary IDictionary<T> 表示鍵/值對的集合code
IComparer IComparer<T> 定義類型爲比較兩個對象而實現的方法
IEqualityComparer IEqualityComparer<T> 定義方法以支持對象的相等比較
IEnumerable IEnumerable<T> 公開枚舉器。實現了該接口意味着容許foreach語句循環訪問集合中的元素
IEnumerator IEnumerator<T> 支持在泛型集合上進行簡單迭代
下面來詳細介紹各類集合接口和集合。我的認爲應該從根底提及。
先抱着MSDN來講IEnumerable,擴展方法就不說了,擴展方法跳過,留到學Linq的時候再說。
一、IEnumerable接口就一個方法,沒有屬性。
方法 說明
GetEnumerator 返回一個循環訪問集合的枚舉數。 實現或繼承了該接口,就是爲了這個方法,能夠foreach遍歷。
二、IEnumerable<T>接口也同樣,也是就一個方法,沒有屬性。
方法 說明
GetEnumerator 返回一個循環訪問集合的枚舉數。
三、ICollection接口
方法 說明
CopyTo 從特定的 Array 索引處開始,將 ICollection 的元素複製到一個 Array 中。
GetEnumerator 返回一個循環訪問集合的枚舉數。 (繼承自 IEnumerable。)
屬性
Count 獲取 ICollection 中包含的元素數。 原來Count的源頭在這裏。
IsSynchronized 獲取一個值,該值指示是否同步對 ICollection 的訪問(線程安全)。
SyncRoot 獲取可用於同步 ICollection 訪問的對象。
四、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了,怪不得它做爲泛型集合接口的基類。
五、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。)
能夠看到,在不斷的繼承過程當中,這些接口不斷地添加本身的東西,越繼承越多,越繼承越多。
六、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爲何會選擇這個接口來返回數據,其實這個接口的東西夠用了。
七、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>差很少,其實就是鍵/值對的開宗立派者。
八、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 對象中的值。
九、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); } } }
說完了集合接口,如今開始說集合。
一、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(); }
二、非泛型集合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(); }
三、Queue和Queue<T>
Queue成爲隊列,隊列是這樣一種數據結構,數據有列表的一端插入,並由列表的另外一端移除。就像單行道,只能從一段進,從一端出。Queue類實現了ICollection和IEnumerable接口。
Queue的一些重要特性。
一、先進先出
二、能夠添加null值到集合中
三、容許集合中的元素重複
四、Queue容量會按需自動添加
五、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(); }
四、Stack和Stack<T>
Stack稱爲棧,棧和隊列很是類似,只不過隊列是先進先出,而棧中的數據添加和移除都在一端進行,遵照棧中的數據則後進先出。Stack類實現了ICollection和IEnumerable接口。
Stack類的一些重要特性以下:
一、後進先出。
二、能夠添加null值到集合中。
三、容許集合中的元素重複。
四、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(); }
五、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(); }
六、BitArray
BitArray類實現了一個位結構,它是一個二進制位(0和1)的集合。BitArray的值表示true或false。true表示位打開,false表示位關閉。BitArray實現了ICollection和IEnumerable接口。
BitArray的一些特性以下:
一、BitArray集合不支持動態調整,所以沒有Add和Remove方法。
二、若須要調整集合的大小,可經過設置屬性Length的值來實現。
三、集合中的索引從0開始。
四、使用BitArray(int length)構造函數初始化BitArray集合後,其值均爲false。
五、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(); }
各類集合的選用,可查看這篇文章:http://www.cnblogs.com/kissdodog/p/5419986.html