精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

遍歷 Dictionary,你會幾種方式?

開發 前端
昨天在 StackOverflow 上看到一個很有趣的問題,說: 你會幾種遍歷字典的方式,然后跟帖就是各種奇葩的回答,挺有意思,馬上就要國慶了,娛樂娛樂吧,說說這種挺無聊的問題。

一:背景

1. 講故事

[[344323]]

昨天在 StackOverflow 上看到一個很有趣的問題,說: 你會幾種遍歷字典的方式,然后跟帖就是各種奇葩的回答,挺有意思,馬上就要國慶了,娛樂娛樂吧,說說這種挺無聊的問題。

二: 使用 foreach 遍歷

為了方便演示,先上一段測試代碼:

  1. var dict = new Dictionary<int, string>() 
  2.             {                [10] = "A10"
  3.                 [20] = "A20"
  4.                 [30] = "A30"
  5.                 [40] = "A40"
  6.                 [50] = "A50" 
  7.             }; 

1. 直接 foreach dict

如果要拿百分比說話,估計有 50%+ 的小伙伴用這種方式,為啥,簡單粗暴唄,其他沒什么好說的,直接上代碼:

  1. foreach (var item in dict) 
  2.            {                Console.WriteLine($"key={item.Key},value={item.Value}"); 
  3.            } 

 

遍歷 Dictionary,你會幾種方式?

這里的 item 是底層在 MoveNext 的過程中用 KeyValuePair 包裝出來的,如果你不信的話,看下源碼唄:

  1. public bool MoveNext() 
  2.    {        while ((uint)_index < (uint)_dictionary._count) 
  3.        {            ref Entry reference = ref _dictionary._entries[_index++]; 
  4.            if (reference.next >= -1) 
  5.            {                _current = new KeyValuePair<TKey, TValue>(reference.key, reference.value); 
  6.                return true
  7.            }        }    } 

2. foreach 中 使用 KeyPairValue 解構

剛才你也看到了 item 是 KeyValuePair 類型,不過的是 netcore 對 KeyValuePair 進行了增強,增加了 Deconstruct 函數用來解構 KeyValuePair,代碼如下:

  1. public readonly struct KeyValuePair<TKey, TValue> 
  2.     {        private readonly TKey key
  3.         private readonly TValue value; 
  4.         public TKey Key => key
  5.         public TValue Value => value; 
  6.         public KeyValuePair(TKey key, TValue value) 
  7.         {            this.key = key
  8.             this.value = value; 
  9.         }        public void Deconstruct(out TKey keyout TValue value) 
  10.         {            key = Key;            value = Value; 
  11.         }    } 

有了這個解構函數,你就可以在遍歷的過程中直接拿到 key,value,而不是包裝的 KeyValuePair,這在 netframework 中可是不行的哈,實現代碼如下:

  1. foreach ((int key, string value) in dict) 
  2.             {                Console.WriteLine($"key={key},value={value}"); 
  3.             } 

 

遍歷 Dictionary,你會幾種方式?

3. foreach keys

前面的例子都是直接對 dict 進行 foreach,其實你還可以對 dict.keys 進行 foreach 遍歷,然后通過遍歷出的 key 對 dict 進行類索引器讀取,代碼如下:

  1. foreach (var key in dict.Keys) 
  2.           {                Console.WriteLine($"key={key},value={dict[key]}"); 
  3.           } 

 

遍歷 Dictionary,你會幾種方式?

說到這里,不知道你是否有一個潛意識,那就是 dict 只能通過 foreach 進行遍歷,真相是不是這樣的呢? 要尋找答案,還是回頭看一下 foreach 是如何進行遍歷的。

  1. public struct Enumerator : IEnumerator<KeyValuePair<TKey, TValue>>, IDisposable, IEnumerator, IDictionaryEnumerator 
  2. {    public bool MoveNext() 
  3.     {        while ((uint)_index < (uint)_dictionary._count) 
  4.         {            ref Entry reference = ref _dictionary._entries[_index++]; 
  5.             if (reference.next >= -1) 
  6.             {                _current = new KeyValuePair<TKey, TValue>(reference.key, reference.value); 
  7.                 return true
  8.             }        }        _index = _dictionary._count + 1; 
  9.         _current = default(KeyValuePair<TKey, TValue>); 
  10.         return false
  11.     }} 

仔細看這個 while 循環,你就應該明白,本質上它也是對 entries 數組進行遍歷,那底層都用了 while,我是不是可以用 for 來替換然后循環 dict 呢?哈哈,反正就是模仿唄。

三:使用 for 遍歷

為了把 MoveNext 中的代碼模擬出來,重點在于這條語句: ref Entry reference = ref _dictionary._entries[_index++];, 其實很簡單,_entries 數組內容的提取可以用 Linq 的 ElementAt 方法,是不是~ ,改造后的代碼如下:

  1. for (int i = 0; i < dict.Count; i++) 
  2. {                (int key, string value) = dict.ElementAt(i); 
  3.     Console.WriteLine($"key={key},value={dict[key]}"); 

 

遍歷 Dictionary,你會幾種方式?

接下來是不是很好奇這個 ElementAt 擴展方法是如何實現的,一起看看源碼吧。

  1. public static TSource ElementAt<TSource>(this IEnumerable<TSource> source, int index
  2. {        IList<TSource> list = source as IList<TSource>; 
  3.     if (list != null
  4.     {            return list[index]; 
  5.     }        if (index >= 0) 
  6.     {            using (IEnumerator<TSource> enumerator = source.GetEnumerator()) 
  7.         {                while (enumerator.MoveNext()) 
  8.             {                    if (index == 0) 
  9.                 {                        return enumerator.Current
  10.                 }                    index--;                }            }        }    } 

從上面代碼可以看到,如果當前的 source 沒有實現 IList 接口的話,那就是一個巨大的坑,每一次執行 ElementAt 方法,最壞時間復雜度都是 O(N),就拿剛才的 for循環來說,它的最壞時間復雜度就是 O(n!) ,是不是比你想象的要恐怖的多,教訓就是多實踐,多看看源碼~

四:總結

這篇列舉了 4 種遍歷 dict 的方式,不知你會用到哪幾種? 要注意的是最后 ElementAt 對 Source 判別上的大坑一定要明白,不要想當然的以為就是 O(N) ,好了,更多的 遍歷方式 歡迎補充!

責任編輯:未麗燕 來源: 今日頭條
相關推薦

2021-05-07 16:19:36

異步編程Java線程

2023-05-08 15:57:16

二叉樹數據結構

2024-05-10 07:44:23

C#進程程序

2024-02-05 12:08:07

線程方式管理

2022-05-27 06:57:50

Python循環方式生成器

2022-05-18 10:38:51

Redis分布式鎖數據

2023-09-29 11:29:12

Spring異常處理類

2018-11-08 09:09:37

Linux系統恢復

2019-07-23 17:52:59

Spring BootJava開發

2025-01-21 10:04:40

Java并發阻塞隊列

2022-03-28 20:57:31

私有屬性class屬性和方法

2019-07-23 15:56:56

Spring Boot部署servlet

2020-09-07 08:00:48

2023-10-30 11:53:37

繼承JS父類

2014-02-18 10:59:52

nftablesLinux 3.13

2024-11-04 09:39:08

Java?接口Thread?類

2024-06-12 08:05:06

2019-12-17 08:45:30

ifelseJava

2024-04-24 11:24:43

C#數據去重

2021-12-15 23:10:34

JS Debugger 前端開發
點贊
收藏

51CTO技術棧公眾號

free欧美| 在线观看免费黄视频| 亚洲一区视频| 在线播放国产一区二区三区| 91精产国品一二三产区别沈先生| 羞羞视频在线观看不卡| 99re在线精品| 国产在线视频一区| 亚洲欧美在线观看视频| 成人影院在线| 亚洲国产成人精品久久久国产成人一区 | 久在线观看视频| 调教视频免费在线观看| 成人av中文字幕| 国产精品一区二区三区久久久| 欧美成人三级视频| 精品国产aⅴ| 精品久久久久久久人人人人传媒| 日韩一级片播放| 牛牛精品在线| 国产精品美女一区二区三区| 国产精品视频在线免费观看| 中文字幕永久在线视频| 亚洲精品看片| 欧美成人合集magnet| 久久美女免费视频| 欧美三级电影在线| 日韩欧美国产综合一区| 嫩草影院国产精品| 韩国精品一区| 亚洲在线免费播放| 黄色高清视频网站| 91九色在线porn| 久久久激情视频| 久久久久欧美| 刘亦菲久久免费一区二区| 久草在线在线精品观看| 国产精欧美一区二区三区| 久久精品久久国产| 欧美在线91| 精品国产欧美一区二区三区成人| 男人舔女人下部高潮全视频| 五月综合久久| 亚洲第一精品福利| 亚洲熟女乱综合一区二区| 伦一区二区三区中文字幕v亚洲| 欧美日韩在线影院| 欧美爱爱视频免费看| av老司机免费在线| 亚洲国产成人91porn| 欧美少妇在线观看| 在线观看的av| 国产精品国产三级国产aⅴ中文| 欧美一区二区视频17c| 性xxxxbbbb| 91原创在线视频| 国内成+人亚洲| 黄色福利在线观看| 成人性色生活片| 国产在线一区二区三区欧美| 日韩一区免费视频| 26uuu国产一区二区三区| 久久草.com| 青青草观看免费视频在线| 99国产精品一区| 久久伊人资源站| 日本1级在线| 国产亲近乱来精品视频| 亚洲黄色成人久久久| 91啦中文在线| 一区二区三区在线观看欧美| 少妇一晚三次一区二区三区| free性欧美| 欧美日韩亚洲系列| www日韩视频| 九七影院97影院理论片久久| 这里只有精品电影| 免费黄色a级片| 久久夜色电影| 国产一区二区三区在线看| 91香蕉视频污在线观看| 欧美日本三区| 欧美综合在线第二页| 国产精品高清无码| 国产伦精品一区二区三区免费迷| av噜噜色噜噜久久| 天天干视频在线观看| 久久久电影一区二区三区| 亚洲精品一品区二品区三品区 | 国产精品无码AV| 福利一区二区在线| 欧美精品国产精品久久久| a√资源在线| 亚洲午夜久久久久久久久电影网| 国产乱子夫妻xx黑人xyx真爽| 国产综合色在线观看| 91精品国产入口| 在线看黄色的网站| 日韩国产欧美| 欧美精品国产精品日韩精品| 中文字幕在线天堂| 国产成人亚洲综合色影视| 欧美激情www| 2020国产在线视频| 日韩欧美在线第一页| 两女双腿交缠激烈磨豆腐| 亚洲精品进入| 欧美另类极品videosbest最新版本 | 99精品视频精品精品视频 | 经典三级一区二区| 欧美刺激脚交jootjob| 久久精品视频18| 狠狠干成人综合网| 成人淫片在线看| 极品美乳网红视频免费在线观看| 亚洲精品自拍动漫在线| 日韩一级片播放| 国产精品zjzjzj在线观看| 综合av色偷偷网| 欧美videossex极品| 国产电影精品久久禁18| 日本欧美精品久久久| 韩国成人免费视频| 91精品国产手机| 污污视频网站在线免费观看| 亚洲资源av| 国产在线一区二| 青春草视频在线观看| 在线播放日韩导航| 国产精品酒店视频| 久久精品盗摄| 久久99精品久久久久久久久久| 成人在线免费看片| 欧美日韩一区二区三区在线| 欧美做受xxxxxⅹ性视频| 亚洲区第一页| 国产chinese精品一区二区| 国产二区视频在线观看| 欧美丝袜第一区| 人体私拍套图hdxxxx| 一区二区亚洲| 成人免费视频观看视频| 欧美家庭影院| 欧美刺激脚交jootjob| 欧美精品入口蜜桃| 国产成人精品三级麻豆| 亚洲一区3d动漫同人无遮挡 | av黄色在线观看| 日本韩国欧美国产| 欧美日韩高清丝袜| 久久三级视频| 亚洲黄色一区二区三区| 欧美一区二区三区婷婷| 视频直播国产精品| 中文字幕+乱码+中文| 欧美高清在线一区二区| 在线免费观看视频黄| 91综合视频| 5566中文字幕一区二区| 免费毛片在线看片免费丝瓜视频| 日韩一区二区在线免费观看| 欧美精品xxxxx| 北岛玲一区二区三区四区| 亚洲 自拍 另类小说综合图区| 久久久久观看| 欧洲美女7788成人免费视频| 经典三级在线| 欧美日韩亚洲综合在线| 免费高清在线观看电视| 国产精品影音先锋| 欧美日韩不卡在线视频| 色天下一区二区三区| 日本最新高清不卡中文字幕| 福利视频在线看| 欧美久久久影院| 欧美精品videos极品| eeuss国产一区二区三区| www黄色av| 91一区在线| 国产精品久久久久久久久久久久午夜片| 波多野结衣乳巨码无在线观看| 亚洲国产精品网站| 无码人妻丰满熟妇区bbbbxxxx| 国产精品久久99| 国产亚洲精品成人a| 久久欧美肥婆一二区| 在线观看欧美亚洲| 国产在线播放精品| 国产精品91久久| 污影院在线观看| 日韩av在线影院| 一区二区视频免费| 亚洲一区自拍偷拍| 国产小视频自拍| 国产盗摄一区二区三区| 精品久久一二三| 日韩免费av| 精品91免费| 欧美视频免费看| 久久露脸国产精品| 天堂中文8资源在线8| 亚洲国产欧美在线成人app| 亚洲免费视频二区| 亚洲国产日日夜夜| www.4hu95.com四虎| 成人av电影免费在线播放| 久草在在线视频| 亚洲欧洲日本一区二区三区| 一个色的综合| 午夜精品福利影院| 99视频网站| 成人精品一区二区三区电影| 久久人人爽人人爽人人片av高请| 在线免费观看黄色网址| 亚洲精品有码在线| 国产色片在线观看| 精品视频色一区| av大片免费观看| 亚洲精品自拍动漫在线| 日本一区二区视频在线播放| av中文字幕在线不卡| 成人啪啪18免费游戏链接| 免费人成精品欧美精品| 日韩少妇内射免费播放18禁裸乳| 欧美在线网址| 伊人色综合影院| 国产一区二区三区不卡视频网站| 国产精品一区视频| 美女国产精品久久久| 91精品久久久久久久| 美女色狠狠久久| 日本精品久久久久影院| 欧美freesex黑人又粗又大| 欧美疯狂性受xxxxx另类| 黄色动漫在线| 精品国产欧美成人夜夜嗨| √新版天堂资源在线资源| 亚洲片国产一区一级在线观看| 狠狠躁日日躁夜夜躁av| 欧美成人福利视频| www.五月天激情| 91精品国产91久久久久久一区二区 | 3d动漫啪啪精品一区二区免费 | 欧美日韩免费观看一区二区三区| 五月天婷婷久久| 欧美色欧美亚洲高清在线视频| 精品无码一区二区三区电影桃花 | 最近中文字幕免费mv| 日韩欧美一区二区三区在线视频| 日本在线视频不卡| 欧美人与物videos另类xxxxx| 精品蜜桃一区二区三区| 日本亚洲不卡| 欧美日韩国产免费一区二区三区| 色老板在线视频一区二区| 麻豆精品视频| 欧美精品尤物在线观看| 神马影院一区二区| 久久视频国产| 天天做天天爱天天高潮| 欧美国产91| 日韩 欧美 视频| 日韩五码在线| 国产精品亚洲二区在线观看| 日韩高清在线不卡| 色国产在线视频| 精品在线亚洲视频| www.偷拍.com| av激情亚洲男人天堂| 免费黄色在线视频| av成人免费在线观看| 玖玖爱在线观看| 国产精品久久夜| 精品无码免费视频| 色婷婷久久99综合精品jk白丝| 波多野结衣视频网址| 欧美日韩在线播放一区| 不卡av中文字幕| 日韩精品极品视频| 91在线看片| 欧美激情在线观看| 另类图片综合电影| 国产主播喷水一区二区| 超碰精品在线观看| 久久一区二区三区av| 成人vr资源| 妺妺窝人体色www看人体| 久久亚洲风情| 青娱乐精品在线| 久久综合色鬼综合色| 久久久免费看片| 亚洲午夜激情av| 婷婷激情五月综合| 日韩一区二区影院| 日韩一二三四| 波霸ol色综合久久| 日本三级一区| 91久久精品美女| 五月天亚洲色图| 久久久久久久久网| 日本欧美一区二区三区乱码| 日韩精品国产一区| 国产婷婷精品av在线| 亚洲国产成人精品综合99| 日韩欧美亚洲国产一区| www.成人精品| 一区二区三区美女xx视频| 欧美aaaxxxx做受视频| 国产精品稀缺呦系列在线| 男人的天堂久久| 97超碰免费观看| 日韩国产精品久久久久久亚洲| 黄色在线免费播放| 国产精品电影一区二区| 久久久久久久黄色片| 91精品国产色综合久久不卡蜜臀 | 欧美日韩视频免费| 日韩不卡手机在线v区| 国产精品果冻传媒| 亚洲欧美另类小说| 综合久久中文字幕| 亚洲精品在线91| av影院在线免费观看| 91在线高清免费观看| 成人6969www免费视频| 免费在线激情视频| www.99精品| 九九九免费视频| 欧美日韩亚洲综合一区二区三区| 天堂中文资源在线| 69av成年福利视频| 国产精品白丝一区二区三区| 国产又黄又爽免费视频| 香蕉久久久久久久av网站| 欧美床上激情在线观看| 日日夜夜天天综合| 久久久影院一区二区三区 | 国产乱子伦视频一区二区三区| 久久精品视频18| 日韩欧美在线一区| 亚洲色图狠狠干| 97精品国产97久久久久久| 日韩成人精品| 懂色av粉嫩av蜜臀av| 老司机午夜精品| 极品美妇后花庭翘臀娇吟小说| 91黄视频在线| 国产区视频在线| 国产成人综合av| 欧美最新另类人妖| 波多结衣在线观看| 中文字幕的久久| 最近中文在线观看| 丝袜美腿精品国产二区| 欧美123区| 亚洲啪啪av| 久久福利视频一区二区| 最新av电影网站| 69堂国产成人免费视频| 超碰电影在线播放| 91麻豆精品秘密入口| 一区在线免费| 一本加勒比波多野结衣| 狠狠躁夜夜躁久久躁别揉| 久久久久久久久亚洲精品| 国产精品第1页| 久久一区二区三区电影| 日本高清免费在线视频| 一区二区三区不卡视频在线观看| 亚洲产国偷v产偷v自拍涩爱| 久久久久久91| 天海翼精品一区二区三区| 国产精品天天av精麻传媒| 国产精品久久久久久久久免费樱桃| 最近中文字幕在线观看视频| 久久精品福利视频| swag国产精品一区二区| 成人毛片视频网站| 中文字幕av一区 二区| 国内精品久久久久久久久久| 欧美精品videos性欧美| 伊人久久综合影院| 亚洲欧美日韩精品一区| 亚洲自拍偷拍欧美| 日本一本草久在线中文| 国产九九精品视频| 亚洲大片av| 亚洲国产日韩一区无码精品久久久| 欧美日韩精品系列| 2018av在线| 亚洲国内在线| www.66久久| 91在线观看喷潮| 3344国产精品免费看| 日韩精品永久网址| 国产日韩视频一区| 欧美日韩一区国产| 小视频免费在线观看| 自拍偷拍99| 99国产欧美另类久久久精品|