1. 程式人生 > >C#的集合類(資料結構)

C#的集合類(資料結構)

本文由本人簡書搬遷至此,並做小幅修改。

先上 C#官方文件

.NET Framework 提供了一些常用的、標準的 集合類(資料結構)
它們被定義在以下名稱空間中。
!###注意###,Unity目前(2017.3.1f1)穩定執行在.net3.5環境中, 所以.net3.5以上功能基本上暫時不可用。

Unity C#版本

一、System.Collections

該名稱空間包含 定義了各種物件,如列表、 佇列、 位陣列、 雜湊表、字典集合的介面和類。

1.BitArray
簡述:位陣列。管理位值的壓縮陣列,這些值以布林值的形式表示,其中 true 表示此位為開 (1),false 表示此位為關 (0)。

2.ArrayList
簡述:相當於可變長陣列。
結構:線性表。
排序:不保證排序但支援呼叫Sort排序。
訪問方式:通過整數索引訪問,索引從0開始。
元素有效性:接受 null 作為有效值,允許重複的元素。
操作效率(不考慮容量改變):
IndexOf是線性搜尋,為O(n);
this[index]為O(1);
Add為O(1);
Insert為O(n);
Remove或RemoveAt是線性搜尋,為O(n) 。

3.Hashtable
簡述:表示根據鍵的雜湊程式碼進行組織的鍵/值對的集合。元素型別是DictionaryEntry
結構:雜湊表(雜湊儲存)。
排序:不支援排序。
訪問方式:通過鍵值訪問。可通過foreach遍歷。
元素有效性:key不能為null,value可為null。key不允許重複,value可以重複。
操作效率(不考慮容量改變):
this[key]為O(1);
Add為O(1);
Remove為O(1)。

4.Queue
簡述:佇列。表示物件的先進先出, 後進後出集合。
結構:線性表。
排序:不支援按值排序,因為本身存在佇列順序。
訪問方式:不支援隨機訪問,只能先進先出, 後進後出。
元素有效性:接受 null 作為有效值,並允許重複的元素。
操作效率(不考慮容量改變):
Enqueue為O(1);
Dequeue為O(1);
Peek為O(1);

5.Stack
簡述:棧。表示物件的先進後出, 後進先出集合。
結構:線性表。
排序:不支援按值排序,因為本身存在棧順序。
訪問方式:不支援隨機訪問,只能先進後出, 後進先出。
元素有效性:接受 null 作為有效值,並允許重複的元素。
操作效率(不考慮容量改變):
Push為O(1);
Pop為O(1);
Peek為O(1);

6.SortedList
簡述:有序列表(鍵有序)。元素型別是DictionaryEntry
結構:線性表?()。
排序:元素加入後,按key自然排序。
訪問方式:既可按照鍵訪問,也可按索引訪問。
元素有效性: key不能為null,value可為null。key不允許重複,value可以重複。
操作效率(不考慮容量改變):
IndexOfKey使用二進位制搜尋演算法,因此為O(log n);
IndexOfValue使用線性搜尋,因此為 O(n);
Add 新增未排序資料為O(n),列表末尾新增為O(log n)。
Remove或RemoveAt為O(n)。

二、System.Collections.Generic

該名稱空間包含定義泛型集合的介面和類,使用者可以使用泛型集合來建立 強型別 集合,這種集合能提供比非泛型強型別集合更好的型別安全性和效能。
為什麼後者有更好的型別安全性和效能?
因為:
前者,集合中的元素是 Object
後者,集合中的元素是 泛型
通過Object集合建立的是弱型別集合,型別轉換髮生在執行時,如果目標型別是值型別,就需要裝箱和拆箱。所以它的型別安全性較差,效能較低。
通過泛型集合建立的是強型別集合, 在編譯階段就能夠確定型別。所以它的型別安全性較好,效能較高。
實際程式設計中,最常用的主要就是 System.Collections 和 System.Collections.Generic這兩個名稱空間。甚至, Unity2017 在建立C#指令碼時預設using了這倆。

1.List<T>
System.Collections名稱空間下 ArrayList 的泛型實現,特點與之相同。

2.Dictionary<TKey, TValue>
System.Collections名稱空間下 Hashtable 的泛型實現,特點與之相同。
不同的是,通過foreach遍歷時,元素型別是 KeyValuePair<TKey, TValue>

3.Queue<T>
System.Collections名稱空間下 Queue 的泛型實現,特點與之相同。

4.Stack<T>
System.Collections名稱空間下 Stack 的泛型實現,特點與之相同。

5.HashSet<T>
簡述:雜湊集合。存放唯一元素的集合,可進行數學集合運算, 這個集合被NRatel忽略了兩三年【捂臉】,實際上可用於 “只當做一個pool,或者說用字典的話顯得key比較多餘” 時, 非常好用。
結構:雜湊表(雜湊儲存)。
排序:不支援排序。
訪問方式:不需要索引取值,不需要Find(因為值不唯一不重複) 。可通過foreach遍歷,元素型別是T。
元素有效性: 元素允許為null,但不允許重複。
操作效率(不考慮容量改變):
Add為O(1);
Remove為O(1);

6.LinkedList<T>
簡述:雙向連結串列。表示雙重連結列表
結構:線性表。
排序:不支援直接排序。
訪問方式:不需要索引方式取值。可通過foreach遍歷,元素型別是T。
元素有效性: 元素允許為null,並允許重複的值。如果 LinkedList<T> 為空, FirstLast 屬性包含 null
操作效率(不考慮容量改變):
AddAfter、AddBefore、AddFirst、AddLast為O(1);
Find查詢值對應的Node是線性搜尋,為O(n);
First、Last為O(1);
Remove(T)是線性搜尋,為 O (n);
Remove(LinkedListNode<T>),為O(1);
RemoveFitst、RemoveLast,為O(1);

7.SortedList<TKey, TValue>
System.Collections名稱空間下 SortedList 的泛型實現,特點與之相同。
不同的是,通過foreach遍歷時,元素型別是 KeyValuePair<TKey, TValue>

8.SortedDictionary<TKey, TValue>
簡述:有序字典(鍵有序)。元素型別是 KeyValuePair<TKey, TValue>
結構:二叉樹。
排序:元素加入後,按key自然排序。
訪問方式:通過鍵值訪問。可通過foreach遍歷。
元素有效性: key不能為null,value可為null。key不允許重複,value可以重複。
操作效率(不考慮容量改變):
this[key]為O(log n);
TryGetValue為O(log n);
Add 為O(log n);
Remove 為O(log n)。

9.SortedSet<T> (.Net 4.0及以上,Unity(.Net3.5)中不包含,不可用)
10.SynchronizedCollection<T> (.Net 3.0及以上,但Unity(.Net3.5)中不包含,不可用)
11.SynchronizedKeyedCollection<K, T>(.Net 3.0及以上,但Unity(.Net3.5)中不包含,不可用)
12.SynchronizedReadOnlyCollection<T>(.Net 3.0及以上,但Unity(.Net3.5)中不包含,不可用)

三、System.Collections.Concurrent (.NET 4.0 及以上)

該名稱空間提供多個執行緒安全集合類。當有多個執行緒併發訪問集合時,應使用這些類代替 System.Collections 和 System.Collections.Generic 名稱空間中的對應型別。
但是,通過當前集合實現的例項之一訪問的成員(包括擴充套件方法)不保證是執行緒安全的,可能需要由呼叫方同步。

四.System.Collections.ObjectModel

該名稱空間包含可用作集合的物件模型的可重用的庫中的類。在屬性或方法返回集合時使用這些類。

五.System.Collections.Specialized

該名稱空間包含專用和強型別集合; 例如,連結的表詞典、 位向量和集合,其中包含僅字串。



https://docs.microsoft.com/zh-cn/dotnet/standard/collections/