.NET集合該怎么理解,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
成都創(chuàng)新互聯(lián)始終堅持【策劃先行,效果至上】的經(jīng)營理念,通過多達十多年累計超上千家客戶的網(wǎng)站建設總結(jié)了一套系統(tǒng)有效的推廣解決方案,現(xiàn)已廣泛運用于各行各業(yè)的客戶,其中包括:發(fā)電機維修等企業(yè),備受客戶稱揚。
集合是一些有共同特征的獨立數(shù)據(jù)項組成的,通過集合,我們可以可以使用相同的調(diào)用代碼來處理一個集合的所有元素,而不用單獨處理每一個單獨的項。.net的集合諸如(System.Array類以及 System.Collections命名空間)數(shù)組、列表、隊列、堆棧、哈希表、字典甚至(System.Data下)DataSet、DataTable,還有2.0中加入的集合的泛型版本(System.Collections.Generic和 System.Collections.ObjectModel),4.0中引入的有效線程安全操作的集合(System.Collections.Concurrent)。
面對這么多的集合,你了解各個集合有哪些優(yōu)勢,在一個特定的場景中使用哪個集合嗎?下面試圖探討一下這個問題,泛泛而談,不涉及深入的內(nèi)存數(shù)據(jù)結(jié)構(gòu)的追究。
在分別討論各種集合之前,我們先討論一下集合的共性,整個集合體系的繼承層次。
ICollection 接口是 System.Collections 命名空間中類的基接口,而相應的ICollection
ICollection又繼承IEnumerable,來提供方便的枚舉功能,不過更值得注意ICollection提供同步訪問的線程安全性控制:
IsSynchronized:獲取一個值,該值指示是否同步對 ICollection 的訪問(線程安全)。
SyncRoot:獲取可用于同步對 ICollection 的訪問的對象。
例如,我們可以通過以下來對集合進行線程安全訪問,不過有些集合提供Synchronized方法來提供線程安全集合的封裝。
ICollection myCollection = someCollection; lock(myCollection.SyncRoot) { // Insert your code here.
}
不過默認情況下集合不是線程安全的。如果需要對集合進行可伸縮的且高效的多線程訪問,請使用System.Collections.Concurrent命名空間中的某個類。
而與非泛型版本不同的是,泛型版本的集合除了實現(xiàn)了泛型的接口外,也實現(xiàn)了非泛型的相應的接口。如ICollection
微軟推出了System.Collections.Concurrent集合,在這個命名空間里,開發(fā)了一批線程安全的對象,當然內(nèi)核也類似于lock機制,但小微自己一定是做了不少優(yōu)化的,這是我們能肯定的。
另外,IList和IDictionary分別繼承自ICollection,IList的實現(xiàn)者(如Array、ArrayList 或 List
接下來,我們將分別討論和比較下一些常用的集合。
Array不是System.Collections的一部分,但是它繼承自IList接口。.net的Array可以有多維數(shù)組、交錯數(shù)組,甚至創(chuàng)建下限不是0是數(shù)組,默認情況下推薦使用下限是0的一維數(shù)組,這常用的數(shù)組是經(jīng)過優(yōu)化的,性能最高。
與System.Collections集合不同的是,Array具有固定的容量,若要增加容量,您必須創(chuàng)建具有所需容量的新 Array 對象,將舊 Array 對象中的元素復制到新對象中,然后刪除該舊 Array。而System.Collections下的集合在達到當前容量時可自動擴充容量:內(nèi)存被重新分配,元素從舊集合復制到新集合中。 這減少了使用集合所需的代碼,但是,集合的性能可能仍受到消極影響。 因此我們應將初始容量設置為集合的估計的大小以避免因多次重新分配導致的不佳性能。
該類型的集合都具有排序功能且大多數(shù)經(jīng)過了索引。能自動處理內(nèi)存管理,容量按需擴大。
ArrayList和List
Hashtable 和 Dictionary 集合類型:這些集合每個項是一個鍵值對。Dictionary
已排序的集合類型:System.Collections.SortedList 類、System.Collections.Generic.SortedList
隊列和堆棧:就不多做介紹了,如果要臨時存儲數(shù)據(jù),數(shù)據(jù)只在訪問一次后就放棄,就可以使用這類集合。隊列和堆棧的差別就在于訪問的先后不一樣,相信大家都很清楚了。他們也分別有各自的泛型版本和線程安全版本:System.Collections.Queue 類、System.Collections.Generic.Queue
Set集合:該類型集合的兩個類型HashSet
這并不是.net集合的全部,它還有位集合和專用集合。
它的每個元素是一個標識位,而不是對象。其中有BitVector32和BitArray。
BitVector32是一個結(jié)構(gòu),只能存儲32位數(shù)據(jù),可用來存儲位標識或小整數(shù),它是值類型,因此性能更好。
而BitArray是引用類型,它的容量始終與計數(shù)相同,可以通過Length屬性來分配或刪除元素。
NameValueCollection 基于 NameObjectCollectionBase;但NameValueCollection 接受一鍵多值,而 NameObjectCollectionBase 只接受一鍵一值。
System.Collections.Specialized 命名空間中的一些強類型集合包括 StringCollection 和 StringDictionary,它們都包含完全是字符串的值集合和字典。
CollectionsUtil 類提供一系列靜態(tài)方法可以用來創(chuàng)建不區(qū)分大小寫的Hashtable或SortedList集合的實例。
有些集合可以轉(zhuǎn)換。例如,HybridDictionary 類起初是 ListDictionary,增大后就變?yōu)?Hashtable。
另外,KeyedCollection
ListDictionary:使用單向鏈接列表實現(xiàn) IDictionary。建議為通常包括少于 10 個項目的集合,當數(shù)據(jù)項較少時,提供比Hashtable更好的性能。
我們可以使用 LINQ 查詢來訪問內(nèi)存中的實現(xiàn)了System.Collections.IEnumerable 或 System.Collections.Generic.IEnumerable
它提供了一種通用的數(shù)據(jù)訪問模式;與標準 foreach 循環(huán)相比,它通常更加簡潔,可讀性更高;提供了強大的篩選、排序和分組功能。
我們首先要明確,如果存在泛型版本,優(yōu)先使用。
選擇之前請先確定幾個問題:
是否需要按序列訪問,元素在訪問后放棄?
訪問的順序是先進先出或后進先出、隨機訪問?
是基于索引的訪問,還是基于鍵的訪問?
是只有值,還是鍵值對形式?
是一對一,還是一對多?
是否允許重復?
是按進入的順序保存,還是需要按一定的規(guī)則排好序的,還是無所謂?
是否需要更快速度的檢索和訪問?
關(guān)于.NET集合該怎么理解問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。