遍歷 Dictionary,你會幾種方式?

2021-10-09 20:35:30 字數 2440 閱讀 2232

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

var dict = new dictionary()

;

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

這裡的 item 是底層在 movenext 的過程中用 keyvaluepair 包裝出來的,如果你不信的話,看下原始碼唄:

public bool movenext()}}

剛才你也看到了 item 是 keyvaluepair 型別,不過??的是 netcore 對 keyvaluepair 進行了增強,增加了 deconstruct 函式用來解構 keyvaluepair,**如下:

public readonly struct keyvaluepair

public void deconstruct(out tkey key, out tvalue value)

}

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

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

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

public struct enumerator : ienumerator>, idisposable, ienumerator, idictionaryenumerator

}_index = _dictionary._count + 1;

_current = default(keyvaluepair);

return false;}}

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

為了把 movenext 中的**模擬出來,重點在於這條語句:ref entry reference = ref _dictionary._entries[_index++];, 其實很簡單,_entries 陣列內容的提取可以用 linq 的 elementat 方法,是不是~ ,改造後的**如下:

接下來是不是很好奇這個 elementat 擴充套件方法是如何實現的,一起看看原始碼吧。

public static tsource elementat(this ienumerablesource, int index)

if (index >= 0)

index--;}}

}}

從上面**可以看到,如果當前的 source 沒有實現 ilist 介面的話,那就是乙個巨大的坑,每一次執行 elementat 方法,最壞時間複雜度都是 o(n),就拿剛才的 for迴圈來說,它的最壞時間複雜度就是 o(n!) ,是不是比你想象的要恐怖的多,教訓就是多實踐,多看看原始碼~

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

遍歷 Dictionary,你會幾種方式?

一 背景 講故事昨天在 stackoverflow 上看到乙個很有趣的問題,說 你會幾種遍歷字典的方式,然後跟帖就是各種奇葩的回答,挺有意思,馬上就要c 教程國慶了,娛樂娛樂吧,說說這種挺無聊的問題?var dict new dictionary int,string 直接 foreach dict...

3個非常實用的Python爬蟲工具,你會幾個?

1.xpath helper xpath helper 是乙個面向 xpath 初學者的 google chrome 外掛程式。相對於人工找 xpath 語法,xpath helper 可以實現自動分析。只要你開啟乙個網頁,然後點選任何乙個網路元素,xpath helper 就能自動幫你找出相應的 ...

換了你,你會殺了誰?

朋友拿了乙份報紙要我作個實驗,我同意了。問題一 如果你知道乙個女人懷孕了,她已經生了8個小孩子了,其中有3個耳朵聾,2個眼睛瞎,乙個智慧型不足,而這個女人自己又有梅毒,請問,你會建議她墮胎嗎?我剛要回答,朋友制止了我,又問我第二個問題。問題二 現在要選舉一名領袖,而你這一票很關鍵,下面是關於3個候選...