色尼玛亚洲综合影院,亚洲3atv精品一区二区三区,麻豆freexxxx性91精品,欧美在线91

在C#中選擇正確的集合進(jìn)行編碼

  要選擇正確的集合,我們首先要了解一些數(shù)據(jù)結(jié)構(gòu)的知識。所謂數(shù)據(jù)結(jié)構(gòu),就是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。結(jié)合下圖,我們看一下對集合的分類。

image

  集合分類

  在上圖中,可以看到,集合總體上分為線性集合和非線性集合。線性集合指元素具有唯一的前驅(qū)和后驅(qū)的數(shù)據(jù)結(jié)構(gòu)類型。非線性集合是指具有多個前驅(qū)或后驅(qū)的數(shù)據(jù)結(jié)構(gòu)類型,如:樹、圖。在FCL中,非線性集合實現(xiàn)的比較少,所以我們將會更多的討論線性集合。

  注意:由于類型安全、轉(zhuǎn)型效率等方面的原因,本建議將只討論泛型集合。

  線性集合按存儲方式,又分為直接存儲和順序存儲。所謂直接存儲是指:該類型的集合數(shù)據(jù)元素可以直接通過下標(biāo)(也即index)來訪問,在C#中有三種形式:Array(包括數(shù)組和ListT),string,struct。直接存儲結(jié)構(gòu)的優(yōu)點是:向數(shù)據(jù)結(jié)構(gòu)中添加元素是很高效的,只要直接放在數(shù)據(jù)末尾的第一個空位上就可以了。它的缺點是:向集合插入元素將會變得低效,它需要給插入的元素騰出位置并順序移動后面的元素。

  string和structs雖然是直接存儲結(jié)構(gòu),但它們與一般的集合定義有很大的不同,所以也不在本建議討論之中。在直接存儲的數(shù)據(jù)結(jié)構(gòu)中,需要區(qū)分的是數(shù)組和ListT的選擇。再次強(qiáng)調(diào)一下:如果集合的數(shù)目固定并且不涉及到轉(zhuǎn)型,使用數(shù)組效率高,否則就使用ListT。

  順序存儲結(jié)構(gòu),也即線性表。線性表的大小可動態(tài)的擴(kuò)大和縮小,它在一片連續(xù)的區(qū)域中存儲數(shù)據(jù)元素。線性表不能按照索引進(jìn)行查找,它通過對地址的引用來搜索元素,為了找到某個元素,它必須遍歷所有元素,直到找到對應(yīng)的元素為止。所以線性表的優(yōu)點是插入和刪除數(shù)據(jù)效率高,而缺點是查找的效率相對來說低一些。

  線性表又可以分為隊列、棧以及索引群集,在C#中,分別表現(xiàn)為:QueueT,StackT,索引群集又進(jìn)一步泛化為字典類型Dictionary TKey, TValue 和雙向鏈表LinkedListT。

  隊列QueueT遵循的是先入先出模式,它在集合末尾添加元素,在集合起始刪除元素,如圖:

image

隊列操作

  根據(jù)隊列的特點,可以用來處理并發(fā)命令等場景:將所有客戶端的命令先入隊,由專門的工作線程來執(zhí)行隊列的命令。在分布式中的消息隊列就是一個典型的隊列應(yīng)用實例。

  棧StackT遵循的是后入先出模式,它在集合末尾添加元素,同時也在集合末尾刪除元素,如圖2-3:

image

棧操作

  字典DictionaryTKey, TValue存儲的是鍵值對,值在基于鍵的散列碼的基礎(chǔ)上進(jìn)行存儲。字典類對象由包含集合元素的存儲桶組成,每一存儲桶與基于該元素的鍵的哈希值關(guān)聯(lián)。如果需要根據(jù)鍵進(jìn)行值的查找,使用DictionaryTKey, TValue將會使搜索和檢索更會快捷。

  雙向鏈表LinkedListT是一個類型為LinkedListNode的元素對象的集合。當(dāng)我們在集合中覺得插入和刪除數(shù)據(jù)很慢的時候,我們可以考慮使用鏈表。如果我們使用LinkedListT,我們會發(fā)現(xiàn)此類型并沒有其它集合普遍具有的Add方法,取而代之的是AddAfter、AddBefore、AddFirst、AddLast等方法。雙向鏈表中的每個節(jié)點都向前指向Previous節(jié)點,向后指向Next節(jié)點。

  以上討論了線性集合,在FCL中,非線性集合實現(xiàn)的不多。非線性集合分為層次集合和組集合。層次集合,如樹,在FCL中就沒有實現(xiàn)。組集合,又分為集和圖。集在FCL中實現(xiàn)為HashSetT,而圖在FCL中也沒有對應(yīng)實現(xiàn)。集的概念在本意上是指存放在集合中的元素是無序的且不能重復(fù)的。下圖演示了集的用途:

image

集操作

  除了上面我們提到的集合類型,還有其他幾個要掌握的集合類型,它們是在實際應(yīng)用中發(fā)展出來的對以上基礎(chǔ)類型的擴(kuò)展:SortedListT,SortedDictionaryTKey, TValue,SortedSetT。它們所擴(kuò)展的對應(yīng)類為ListT,DictionaryTKey,TValue,HashSetT,作用是將原本無序排列的元素,變?yōu)橛行蚺帕小?

  除了排序上的需求增加了上面3個集合類,在命名空間System.Collections.Concurrent下,還涉及幾個多線程集合類。它們主要是:ConcurrentBagT對應(yīng)ListT,ConcurrentDictionaryTKey, TValue對應(yīng)DictionaryTKey, TValue,ConcurrentQueueT對應(yīng)QueueT,ConcurrentStackT對應(yīng)StackT。如果我們的集合被用于多線程應(yīng)用中,可以使用這幾個集合類型。關(guān)于集合的線程安全性,可以進(jìn)一步查看MSDN。

  本建議到此為止已經(jīng)介紹了FCL中的大部分泛型集合類,為了對它們有更好的了解,最后我們給出一個主要集合類的類圖。實際工作中,應(yīng)該根據(jù)需要選擇合適的集合類。

clip_image002[12]

FCL集合類圖

NET技術(shù)在C#中選擇正確的集合進(jìn)行編碼,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 观塘区| 新郑市| 和林格尔县| 巴中市| 宁乡县| 河北区| 汤原县| 新闻| 临汾市| 新竹县| 彩票| 平潭县| 隆尧县| 郑州市| 北碚区| 丰县| 格尔木市| 孝义市| 察隅县| 礼泉县| 论坛| 楚雄市| 阿巴嘎旗| 冀州市| 平遥县| 恩平市| 成安县| 石楼县| 稷山县| 梅河口市| 兴文县| 遂溪县| 龙山县| 巴青县| 天峻县| 日土县| 临江市| 微博| 宝丰县| 东乡族自治县| 千阳县|