C#集合介面與集合類
C#開發經常用到.NET框架為我們提供的集合介面和集合類,接下來做一個總結,如有差錯,希望各位大神指正。
首先是集合介面,自己畫了一張圖(嘿嘿,有點醜),來說明集合介面的繼承關係。
個人覺得,瞭解集合介面,首先要把握他們的繼承關係。如上圖,所有的集合介面和集合類都繼承/實現IEnumerable介面。IEnumerable只有一個方法GetEnumerator。簽名如下:
IEnumerator GetEnumerator()
這個方法返回值型別為IEnumerator,正是IEnumerator 介面定義了集合遍歷的基本方法,使得我們可以通過遍歷來訪問集合中的元素。
public interface IEnumerator
{
bool MoveNext();
object Current { get; }
void Reset();
}
MoveNext方法是將遊標移動到下一個位置,Current 屬性表示當前項,Reset方法是將遊標重置到第一個項的位置。
其他的各個介面都提供了各種方法,這些都可以直接在開發工具上檢視,暫時略過。接下來說說集合類。
集合類是在實現集合介面的基礎上,做進一步的擴充套件。分為非泛型集合類、泛型集合類、執行緒安全集合類。
非泛型集合類:
1:ArrayList,ArrayList是可變長度的陣列,它的出現就是為了彌補陣列的長度是固定的這個缺陷。但他也帶來了另一個問題,ArrayList可以儲存任意型別的資料,所以它也存在裝箱拆箱所帶來的效能問題。所以,後來.NET2.0以後,就用List<T>取代ArrayList
2:HashTable 鍵值對存取,Key不能重複。通過Key來查詢Value時,速度非常快,但是存取時也存在裝箱拆箱操作。所以後來就被Dictionary<TKey,TValue>所取代。
3:Stack 先進後出,個人一直覺得 棧是一個非常偉大的發明。
4:Queue 先進先出。
泛型集合類:
1:List<T> 可變長度,並且是有序的。所以如果在其尾部增加或刪除資料,那速度比較快。如果在其頭部或中間增加或刪除資料,那速度比較慢,因為還要重新排序。
2:LinkedList<T> 它是一個雙向連結串列,這也是為了彌補List<T>的缺陷而出現的。不管在什麼位置刪除資料,速度都很快。
3:HashSet<T> 它是無序的,不允許通過下標訪問。當對兩個集合進行差集、並集運算的時候,它的效能非常好。
4:SortedSet<T>它是有序的,與HashSet<T>對應。它可以通過Key來索引,也可以通過下標來索引。但是他的效能比HashTable差。
5:Stack<T> 先進後出
6:Queue<T> 先進先出
7:Dictionary<TKey, TValue> 它是對HashTable的優化,不必進行裝箱拆箱操作。多執行緒情況下推薦使用HashTable,因為Dictionary<TKey, TValue>是非執行緒安全的,在多執行緒情況下,要進行lock鎖定,這時效率就比較差了。
執行緒安全集合類 一般情況下,非執行緒安全的集合類,可以通過加上lock來鎖定。.NET提供了執行緒安全集合類
1:ConcurrentDictionary 執行緒安全的Dictionary
2:ConcurrentQueue 執行緒安全版本的Queue
3:ConcurrentStack 執行緒安全版本的Stack
以上是個人對C#集合介面和集合類的總結,部分介面和類可能沒有接觸到。如有遺漏,歡迎交流補充。