一:背景
講故事昨天在 stackoverflow 上看到乙個很有趣的問題,說: 你會幾種遍歷字典的方式,然後跟帖就是各種奇葩的回答,挺有意思,馬上就要c#教程國慶了,娛樂娛樂吧,說說這種挺無聊的問題???。
var dict
= new dictionary<
int, string>()
;
直接 foreach dict
如果要拿百分比說話,估計有 50%+ 的小夥伴用這種方式,為啥,簡單粗暴唄,其他沒什麼好說的,直接上**:
這裡的 item 是底層在 movenext 的過程中用 keyvaluepair 包裝出來的,如果你不信的話,看下原始碼唄:
public bool movenext()}
}
foreach 中 使用 keypairvalue 解構
剛才你也看到了 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 呢?哈哈,反正就是模仿唄。
三:使用 for 遍歷
為了把 movenext 中的**模擬出來,重點在於這條語句: ref entry reference = ref _dictionary._entries[_index++];, 其實很簡單,_entries 陣列內容的提取可以用 linq 的 elementat 方法,是不是~~~ ,改造後的**如下:
接下來是不是很好奇這個 elementat 擴充套件方法是如何實現的,一起看看原始碼吧。
public static tsource elementat
(this ienumerable source,
int index)
if(index >=0)
index--;
}}}}
遍歷 Dictionary,你會幾種方式?
昨天在 stackoverflow 上看到乙個很有趣的問題,說 你會幾種遍歷字典的方式,然後跟帖就是各種奇葩的回答,挺有意思,馬上就要國慶了,娛樂娛樂吧,說說這種挺無聊的問題?var dict new dictionary 如果要拿百分比說話,估計有 50 的小夥伴用這種方式,為啥,簡單粗暴唄,其他...
3個非常實用的Python爬蟲工具,你會幾個?
1.xpath helper xpath helper 是乙個面向 xpath 初學者的 google chrome 外掛程式。相對於人工找 xpath 語法,xpath helper 可以實現自動分析。只要你開啟乙個網頁,然後點選任何乙個網路元素,xpath helper 就能自動幫你找出相應的 ...
換了你,你會殺了誰?
朋友拿了乙份報紙要我作個實驗,我同意了。問題一 如果你知道乙個女人懷孕了,她已經生了8個小孩子了,其中有3個耳朵聾,2個眼睛瞎,乙個智慧型不足,而這個女人自己又有梅毒,請問,你會建議她墮胎嗎?我剛要回答,朋友制止了我,又問我第二個問題。問題二 現在要選舉一名領袖,而你這一票很關鍵,下面是關於3個候選...