欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

ESBasic 可復(fù)用的.NET類庫(kù)(11) -- 雙向映射

系統(tǒng) 1686 0

1. 緣起:

假設(shè)我們的用戶管理系統(tǒng)要求用戶的 ID Name 都必須是唯一的,并且用戶的 ID Name 一經(jīng)確定就不能被修改。而且管理系統(tǒng)經(jīng)常需要根據(jù) ID 來(lái)查找 Name ,也經(jīng)常需要根據(jù) Name 來(lái)查找 ID 。根據(jù)這樣的需求,我們可以考慮使用一個(gè) Dictionary 來(lái)將 ID Name 緩存起來(lái),通常 ID 作為 Key Name 作為 Value 。這樣便可實(shí)現(xiàn)通過(guò) ID 查詢 Name 的快速查找,但是,通過(guò) Name 查找 ID 就不是那么快了,因?yàn)樯婕暗綄?duì) Dictionary Values 做遍歷的操作。那么,有可能使得通過(guò) Name 查找 ID 的速度與通過(guò) ID 查找 Name 的速度一樣快嗎?

于是,我設(shè)計(jì)了 ESBasic.ObjectManagement.Cache.IBidirectionalMapping (雙向映射)來(lái)解決這個(gè)問(wèn)題。

雙向映射的形象示意圖如下:
ESBasic 可復(fù)用的.NET類庫(kù)(11) -- 雙向映射 IBidirectionalMapping


2. 適用場(chǎng)合:

如果滿足以下的條件,則可以使用雙向映射:

(1) Key 是唯一的, Value 也是唯一的。

(2) 需要對(duì) Key Value 做緩存。

(3) 經(jīng)常需要根據(jù) Key 來(lái)查找 Value

(4) 經(jīng)常需要根據(jù) Value 來(lái)查找 Key

3 .設(shè)計(jì)思想與實(shí)現(xiàn)

IBidirectionalMapping 接口定義如下:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> /// <summary>
/// IBidirectionalMapping雙向映射。即Key和Value都是唯一的,在這種情況下使用IBidirectionalMapping可提升依據(jù)Value查找Key的速度。
/// 該接口的實(shí)現(xiàn)必須是線程安全的。2008.08.20
/// </summary>
public interface IBidirectionalMapping < T1,T2 >
{
int Count{ get ;}

/// <summary>
/// Add添加映射對(duì)。如果已經(jīng)有相同的key/value存在,則會(huì)覆蓋。
/// </summary>
void Add(T1t1,T2t2);

void RemoveByT1(T1t1);
void RemoveByT2(T2t2);

T1GetT1(T2t2);
T2GetT2(T1t1);

bool ContainsT1(T1t1);
bool ContainsT2(T2t2);

/// <summary>
/// GetAllT1ListCopy返回T1類型元素列表的拷貝。
/// </summary>
IList < T1 > GetAllT1ListCopy();

/// <summary>
/// GetAllT2ListCopy返回T2類型元素列表的拷貝。
/// </summary>
IList < T2 > GetAllT2ListCopy();
}

該接口使用了兩個(gè)泛型參數(shù),根據(jù)上面的描述,一個(gè)泛型參數(shù)表示 Key 的類型,另一個(gè)泛型參數(shù)表示 Vlaue 的類型。由于,在雙向映射中, Key Value 是對(duì)稱的,所以我沒(méi)有使用 TKey TValue 來(lái)命名它們,而是使用 T1 T2

在實(shí)現(xiàn) BidirectionalMapping 時(shí),我們使用兩個(gè) Dictionary 來(lái)完成雙向映射的功能。一個(gè) Dictionary T1 Key T2 Value ;另一個(gè)剛好反過(guò)來(lái)。

在實(shí)現(xiàn)的具體過(guò)程中,要注意以下幾點(diǎn):

(1) 為了允許在多線程的環(huán)境中使用雙向映射,所以 BidirectionalMapping 必須在對(duì)內(nèi)部 Dictionary 操作的時(shí)候進(jìn)行加鎖控制。

(2) 在實(shí)現(xiàn) Add 方法添加一個(gè)“映射對(duì)”的時(shí)候,必須判斷當(dāng)前是否已經(jīng)存在了相同的值,如果存在,則先刪除舊的映射對(duì),再添加新的映射對(duì)。

(3) 要注意一個(gè)細(xì)節(jié), GetAllT1ListCopy GetAllT2ListCopy 的實(shí)現(xiàn)都使用了 lock ,這是因?yàn)樵诳截惖臅r(shí)候會(huì)對(duì)其 Keys Values 進(jìn)行 foreach 遍歷,而在對(duì) Dictionary 中的元素進(jìn)行 foreach 遍歷的時(shí)候,如果同時(shí)向其中添加或刪除元素,則 foreach 操作是會(huì)拋出異常的。

4. 使用時(shí)的注意事項(xiàng)

BidirectionalMapping 提升了通過(guò) Name 查找 ID 的速度,這是通過(guò)使用了更大的內(nèi)存來(lái)做到的,是典型的“空間換時(shí)間”的例子。所以,對(duì)于巨大規(guī)模的映射對(duì)的緩存,要注意內(nèi)存的使用問(wèn)題。

另外,映射對(duì)中的兩個(gè)元素的類型不一定非是 ID Name 這樣的簡(jiǎn)單對(duì)象,實(shí)際上,非常復(fù)雜的對(duì)象也可以緩存在雙向映射中,只要其 GetHashCode 方法實(shí)現(xiàn)的恰當(dāng)就不會(huì)有任何問(wèn)題。

5. 擴(kuò)展

雙向映射 BidirectionalMapping 暫時(shí)沒(méi)有任何擴(kuò)展。

注:ESBasic源碼可到 http://esbasic.codeplex.com/ 下載。
ESBasic討論:37677395
ESBasic開(kāi)源前言

ESBasic 可復(fù)用的.NET類庫(kù)(11) -- 雙向映射 IBidirectionalMapping


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 日日做夜夜操 | 狠狠色噜噜狠狠狠狠97老肥女 | 91九色视频| 亚洲 中文 欧美 日韩 在线观看 | 国产精品第一区第27页 | 婷婷色婷婷 | 在线播放一区二区三区 | 午夜色a大片在线观看免费 龙珠z在线观看 | 久久久国产精品网站 | 久草在线在线精品观看 | 国产精品视频免费视频 | 久热香蕉精品视频在线播放 | 97视频免费播放观看在线视频 | 亚洲国产第一页 | 一区免费看 | 久久一区二区三区四区 | 午夜电视剧 | 一级黄色毛片视频 | 天天摸天天操免费播放小视频 | 免费一级欧美片片线观看 | 免费国产免费福利视频 | 波多野结衣中文在线播放 | 国产一级黄色网 | 国产精品无码人妻无码色情多人 | 嫩草影院网影院在线 | 九色在线 | 在线观看免费黄色小视频 | 国产精品一区二区三区99 | 日本aaaaa高清免费看 | 日韩精品免费在线视频 | 日韩精品极品视频在线观看免费 | 天天做天天爱天天爽天天综合 | 亚洲三级网| 久草国产视频 | 免费人成在线播放 | www国产精品 | 国产专区在线播放 | 久久99精品国产麻豆婷婷 | 欧美日韩图区 | 一区二区三区国产 | 亚洲一区二区三区在线播放 |