国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

C#:深入分析合并2個(gè)字典

2019-11-11 03:01:44
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

合并2個(gè)字典,并不是一個(gè)難事,但是如果2個(gè)字典有鍵一樣,結(jié)果也許是正確的,但是卻意外改變了另一個(gè)對(duì)象,這并不是我們想看到的,在這里舉一個(gè)例子。

Dictionary<string,List<string>> dict1 = new Dictionary<string, List<string>>(); dict1.Add("qaz",new List<string>(){"100"}); dict1.Add("wsx",new List<string>(){"13"}); Dictionary<string, List<string>> dict2 = new Dictionary<string, List<string>>(); dict2.Add("qaz", new List<string>() { "11" }); dict2.Add("edc", new List<string>() { "17" }); //合并2個(gè)字典到dict Dictionary<string, List<string>> dict = new Dictionary<string, List<string>>();//創(chuàng)建dict foreach (var ele in dict1) //拿到dict1 { dict.Add(ele.Key,ele.Value); } foreach (var ele in dict2) //拿到dict2 { if(dict.ContainsKey(ele.Key)) dict[ele.Key].AddRange(ele.Value); else { dict.Add(ele.Key,ele.Value); } }

dict的結(jié)果正確,{“qaz”, “100”和”11”}, {“wsx”,”13”},{“edc”,”17”} 但是dict1的結(jié)果怎么樣? 也被污染了!!! dict1: {“qaz”, “100”和”11”}, {“wsx”,”13”}

正確的合并,不應(yīng)該污染dict1

分析原因

dict首先添加了dict1的鍵值,也就是dict的鍵值都引用了dict1的鍵值; 接下來(lái),再合并dict2時(shí), 首先判斷dict中是否包含了dict2的鍵,如果包含,則直接再dict的鍵值中添加, 值又引用了同一個(gè)對(duì)象,也就是在dict1的鍵中添加了這個(gè)值。驗(yàn)證下:

bool flag = object.ReferenceEquals(dict[ele.Key], dict1[ele.Key]);//結(jié)果是true

所以污染了dict1

正確做法 避免dict[ele.Key]和dict1[ele.Key]引用相等!!!

Dictionary<string, List<string>> dict = new Dictionary<string, List<string>>(); //先把鍵都合并到dict中,值都是新創(chuàng)建的 foreach (var key in dict1.Keys) { if (!dict.ContainsKey(key)) dict.Add(key, new List<string>()); } foreach (var key in dict2.Keys) { if (!dict.ContainsKey(key)) dict.Add(key, new List<string>()); } //分別將值添加進(jìn)去 foreach (var ele in dict1) { dict[ele.Key].AddRange(ele.Value); } foreach (var ele in dict2) { dict[ele.Key].AddRange(ele.Value); }

dict合并結(jié)果是正確的,并且dict1,dict2都未污染!

總結(jié)

合并字典帶來(lái)的,2個(gè)對(duì)象引用問(wèn)題的思考

如果兩個(gè)對(duì)象都指向內(nèi)存中同一個(gè)地址,也就是引用相等。此時(shí),若改變其中一個(gè)對(duì)象,另一個(gè)也會(huì)改變! 利用這個(gè)引用相等,帶來(lái)了很多好處,比如函數(shù)間的引用傳值(by reference)。但是,如果運(yùn)用不當(dāng),也會(huì)給我們帶來(lái)一些不必要的麻煩,因?yàn)榇藭r(shí)我們不想兩個(gè)對(duì)象都改變,那么我們就得保證不要讓兩個(gè)對(duì)象引用相等,這樣的話(huà),才能做到只改變其一。


上一篇:VS 編譯lua庫(kù)

下一篇:1084

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 搜索| 郁南县| 桐乡市| 凤凰县| 朔州市| 金山区| 盖州市| 武强县| 黎平县| 广元市| 大姚县| 永吉县| 呼玛县| 仙居县| 兴仁县| 延川县| 互助| 桓仁| 铜川市| 万盛区| 达拉特旗| 无锡市| 徐水县| 武汉市| 铁力市| 光山县| 昆明市| 邢台县| 弋阳县| 蒙山县| 黄大仙区| 达州市| 辽宁省| 雅江县| 仪征市| 本溪市| 白山市| 封开县| 通江县| 玉林市| 达孜县|