天天躁日日躁狠狠躁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)系我們修改或刪除,多謝。

主站蜘蛛池模板: 日韩爽爽影院在线播放 | 亚洲国产在线精品国偷产拍 | 日韩在线av免费视久久 | 久久青草热热在线精品 | 欧美午夜不卡在线观看 | WWW国产精品人妻一二三区 | 我的奶头被客人吸的又肿又红 | 女生扒开尿口 | av av在线| 国产亚洲精品久久久999蜜臀 | 99热国产这里只有精品9九 | 四虎成人影院 | 色欲国产麻豆一精品一AV一免费 | 强开乳罩摸双乳吃奶视频 | 乱子伦在线观看中文字幕 | 被同桌摸出水来了好爽的视频 | 久热这里在线精品 | 无码天堂亚洲内射精品课堂 | 24小时日本在线观看片 | 久久超碰色中文字幕 | 一进一出抽搐gif免费60秒 | 91精品乱码一区二区三区 | 国产成人小视频在线观看 | 羞羞麻豆国产精品1区2区3区 | 欧美日韩精品一区二区三区四区 | 樱花草在线影视WWW日本动漫 | 杨幂视频在线观看1分30秒 | 玩弄放荡人妻一区二区三区 | 国产成人高清亚洲一区app | 欧美gv明星 | 精品视频久久久久 | 亚洲AV无码国产精品色午夜情 | 亚洲精品无码葡京AV天堂 | 日本xxxx96| 九九免费高清在线观看视频 | 欧美亚洲日韩自拍高清中文 | 精品国产一区二区三区久久影院 | 最近中文字幕2018MV高清在线 | 九九免费高清在线观看视频 | 中文字幕亚洲乱码熟女在线萌芽 | 97超碰免费人妻中文 |