C 集合類 使用

2022-02-01 09:10:53 字數 2036 閱讀 7814

關聯性集合類即我們常說的鍵值對集合,允許我們通過key來訪問和維護集合。

我們來看一下  .net 為我們提供了哪些泛型的關聯性集合類:

1     dictionary2     sorteddictionary3     sortedlist

dictionary

dictionary可能是最常用的關聯性集合了,它的訪問,新增,刪除資料所花費的時間是所有集合類裡面最快的,

因為它內部用了hashtable作為儲存結構,所以不管儲存了多少鍵值對,查詢/新增/刪除所花費的時間都是一樣的,它的時間複雜度是o(1)。

dictionary優勢是查詢插入速度快,那麼什麼是它的劣勢呢?

因為採用hashtable作為儲存結構,就意味著裡面的資料是無序的,所以想按一定的順序去遍歷dictionary裡面的資料是要費一點工夫的。

作為tkey的型別必須實現 gethashcode() 和 equals() 或者提供乙個 iequalitycomparer,否則操作可能會出現問題。

sorteddictioanry

sorteddictionary和 dictionary大致上是類似的,但是在實現方式上有一點點區別。

sorteddictionary用二叉樹作為儲存結構。並且按key的順序排列。

那麼這樣的話sorteddictionary的 tkey 就必須要實現 icomparable。

如果想要快速查詢的同時又能很好的支援排序的話,那就使用sorteddictionary吧。

sortedlist

sortedlist是另乙個支援排序的關聯性集合。不同的地方在於,sortedlist實際是將資料儲存在陣列中的。

也就是說新增和移除操作都是線性的,時間複雜度是o(n),因為操作其中的元素可能導致所有的資料移動。

但是因為在查詢的時候利用了二分搜尋,所以查詢的效能會好一些,時間複雜度是o(log n)。

非關聯性集合就是不用 key 操作的一些集合類,通常我們可以用元素本身或者下標來操作。.net 主要為我們提供了以下幾種非關聯性的泛型集合類。

1     list2     linkedlist3     hashset4     sortedset5     stack6     queue

list

泛型的 list 類提供了不限制長度的集合型別,list在內部維護了一定長度的陣列(預設初始長度是4),

當我們插入元素的長度超過 4 或者初始長度的時候,會去重新建立乙個新的陣列,這個新陣列的長度是初始長度的2倍(不永遠是2倍,當發現不斷的要擴充的時候,倍數會變大)

然後把原來的陣列拷貝過來。所以如果知道我們將要用這個集合裝多少個元素的話,可以在建立的時候指定初始值,這樣就避免了重複的建立新陣列和拷貝值。

另外由於其內部實質是乙個陣列,所以在list的末尾新增資料是比較快的,但是如果在資料的頭或者中間新增刪除資料相對來說更低效一些,因為會影響其它資料的重新排列。

linkedlist

linkedlist在內部維護了乙個雙向的鍊錶,也就是說我們在linkedlist的任何位置新增或者刪除資料其效能都是很快的。

因為它不會導致其它元素的移動。一般情況下list已經夠我們使用了,但是如果對這個集合在中間的新增刪除操作非常頻繁的話,就建議使用 linkedlist。

hashset

hashset是乙個無序且能夠保持唯一性的集合。我們也可以把 hashse t看作是dictionary,只不過 tkey 和 tvalue 都指向同乙個物件。

hashset非常適合在我們需要保持集合內元素唯一性但又不需要按順序排列的時候。hashset不支援下標訪問。

hashset的優點是佔記憶體空間小,在檢查一組資料裡是否包含乙個值的時候,用它就比較合適。

sortedset

sortedset 和 hashset 就像 sorteddictionary 和 dictionary 一樣,sortedset內部也是乙個二叉樹,用來支援按順序的排列元素。

stack

後進先出的佇列,不支援按下標訪問

queu

先進先出的佇列,不支援按下標訪問

參考:0

C 集合類使用範例

dictionary system.collections.dictionaryentry dic new system.collections.dictionaryentry key1 value1 arraylist system.collections.arraylist list new s...

c 指標與集合類介紹使用

c 是乙個重要的工具,涉及到效能問題的都會使用到c 遺憾的是自己對c 相關的東西不太了解,希望借助這波學習能弄通它。首先弄懂兩個符號的意思,每乙個變數都有乙個記憶體位置,每乙個記憶體位置都定義了可使用連字型大小 運算子訪問的位址,它表示了在記憶體中的乙個位址。請看下面的例項,它將輸出定義的變數位址 ...

C 集合介面與集合類

c 開發經常用到.net框架為我們提供的集合介面和集合類,接下來做乙個總結,如有差錯,希望各位大神指正。首先是集合介面,自己畫了一張圖 嘿嘿,有點醜 來說明集合介面的繼承關係。個人覺得,了解集合介面,首先要把握他們的繼承關係。如上圖,所有的集合介面和集合類都繼承 實現ienumerable介面。ie...