四虎精品视频-四虎精品成人免费网站-四虎黄色网-四虎国产视频-国产免费91-国产蜜臀97一区二区三区

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

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

image

  集合分類(lèi)

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

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

  線(xiàn)性集合按存儲(chǔ)方式,又分為直接存儲(chǔ)和順序存儲(chǔ)。所謂直接存儲(chǔ)是指:該類(lèi)型的集合數(shù)據(jù)元素可以直接通過(guò)下標(biāo)(也即index)來(lái)訪(fǎng)問(wèn),在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),也即線(xiàn)性表。線(xiàn)性表的大小可動(dòng)態(tài)的擴(kuò)大和縮小,它在一片連續(xù)的區(qū)域中存儲(chǔ)數(shù)據(jù)元素。線(xiàn)性表不能按照索引進(jìn)行查找,它通過(guò)對(duì)地址的引用來(lái)搜索元素,為了找到某個(gè)元素,它必須遍歷所有元素,直到找到對(duì)應(yīng)的元素為止。所以線(xiàn)性表的優(yōu)點(diǎn)是插入和刪除數(shù)據(jù)效率高,而缺點(diǎn)是查找的效率相對(duì)來(lái)說(shuō)低一些。

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

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

image

隊(duì)列操作

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

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

image

棧操作

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

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

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

image

集操作

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

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

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

clip_image002[12]

FCL集合類(lèi)圖

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

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

主站蜘蛛池模板: 一二三年级的童话绘画| 春节到,人欢笑,贴窗花,放鞭炮| 阿妹的诺言| 抖音app| 疯狂48小时| 蛇魔女大闹都市| 抗击 电影| 安徽卫视| 我们的日子电视剧演员表| 3片| 天国恩仇| 曲丹个人资料简介| 小娥| 诗经中使用叠词的诗句| 黄视频在线网站| 又大又肥又圆的白屁股| 诈欺游戏电影| 大奉打更人电视剧在线观看全集免费播放| 杨英格| 四年级上册麻雀的课堂笔记| 电锯狂魔| 三年电影免费高清完整版| 我的英雄学院第三季| 2024年怀男怀女表图| 菊地亚美| 妈妈的脊背简谱| 格伦鲍威尔| 九州电影网| 掐脖子的视频| 哥也要| 456电影网络重口味456| 爱四| 糟老头视频| 恰纳卡莱之战完整版在线观看| 欧美变态sososo另类| 小涛讲电影| 电视剧《节妇》在线观看| 超级方程式| 黄视频免费观看网站| 电影《kiskisan》在线播放| 二手家具转让|