2010-07-16 296 views
8

我剛剛開始使用F#,我想遍歷字典,獲取鍵和值。通過字典的F#迭代

所以在C#中,我把:

IDictionary resultSet = test.GetResults; 
foreach (DictionaryEntry de in resultSet) 
{ 
    Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value); 
} 

我似乎無法找到一種方法,在F#做到這一點(不是一個編譯反正)。

任何人都可以建議在F#中的等效代碼?

乾杯,

粉碎

回答

2
resultSet |> Map.iter (fun key value -> 
    printf "Key = %A, Value = %A\n" key value) 
+0

好奇 - 任何原因printf與\ n在字符串的結尾,而不是隻是printfn? – 2010-07-16 18:12:49

+0

每當我看到'printfn'時,我都會問相反的問題。沒有理由,當然,只是個人喜好。 – 2010-07-16 19:51:52

18

什麼是你的字典的類型?

如果非通用IDictionary爲您的代碼段建議,請嘗試以下(在F#中,for不會隱插入轉換,所以你需要添加Seq.cast<>得到一個類型的集合,你可以輕鬆地與工作):

​​

如果您正在使用通用IDictionary<'K, 'V>那麼你不需要調用Seq.cast(如果你有在庫中的任何控制,這比前一個選項)更好:

for entry in dict do 
    // use 'entry.Value' and 'entry.Key' here 

如果您使用不可變的F#Map<'K, 'V>類型(如果您正在使用F#編寫功能代碼,那麼這是最好的類型),那麼您可以使用Pavel的解決方案,或者可以使用for循環和KeyValue有效模式這樣的:

for KeyValue(k, v) in dict do 
    // 'k' is the key, 'v' is the value 

在這兩種情況下,你可以使用for或各種iter功能。如果你需要執行某些副作用,那麼我寧願使用for循環(這不是我提到的第一個答案:-)),因爲這是爲此設計的語言構造。對於功能處理,你可以使用各種功能,如Seq.filter等..

+0

使用方法*(函數?)*對循環進行良好的調用,並帶有副作用。 – ChaosPandion 2010-07-16 18:13:14

+3

但「iter」的整個觀點也是爲了執行副作用(如其類型所證明的那樣),所以它也是「爲此設計的......」(這並不是說「for」是劣等的,當然;事實上,我只是不知道'KeyValue')。 – 2010-07-16 19:53:42

+0

@Pavel:是的,'iter'也是爲此設計的。然而,我的印象是'iter'是從OCaml繼承而來的,F#這樣做的方式是使用'for'(儘管這可能是個人偏好)。一般來說,我認爲如果你正在做一些語言結構合適的語言結構,那麼語言結構就比庫函數更受歡迎。 – 2010-07-16 20:03:41