天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

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

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

image

  集合分類

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

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

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

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

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

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

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

image

隊(duì)列操作

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

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

image

棧操作

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

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

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

image

集操作

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

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

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

clip_image002[12]

FCL集合類圖

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

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

主站蜘蛛池模板: 芭乐草莓樱桃丝瓜18岁大全 | HEYZO精品无码一区二区三区 | 精品AV综合导航 | 中文字幕一区中文亚洲 | 无码乱人伦一区二区亚洲 | 欧美一区二区三区激情视频 | 无码乱人伦一区二区亚洲 | 中文字幕午夜乱理片 | 韩国伦理片2018在线播放免费观看 | 青青青青草 | 99热精品在线av播放 | 翁熄性放纵交换300章 | 日本高清免费一本在线观看 | 成人免费视频在 | 伦理片免费秋霞e | 台湾佬综合娱乐网 | 秋霞电影网视频一区二区三区 | 中国拍三a级的明星女 | 一边吃奶一边啪啪真舒服 | 日本乱hd高清videos | 99久久e免费热视频百度 | 国产精品亚洲第一区二区三区 | 91传媒蜜桃香蕉在线观看 | 一二三四免费中文在线1 | 动漫美女喷水 | 变态露出野外调教 | 首页_亚洲AV色老汉影院 | ass女人下部欣赏 | 欧美白人极品性喷潮 | 色色男_免费 | 国产精品久久久久影院色老大 | ai换脸女明星被躁在线观看免费 | 一点色成人| 别停好爽好深好大好舒服视频 | 99久久综合国产精品免费 | 久青草国产97香蕉在线视频 | 含羞草影院免费区 | 18禁在线无遮挡羞羞漫画 | 97人妻丰满熟妇AV无码 | 99RE6这里只有精品国产AV | 好湿好滑好硬好爽好深视频 |