2015-06-25 33 views
6

我有這樣的C#示例,這將創建奇數和偶數號碼的字典從整數數組:如何讓ToDictionary在F#中工作?

int[] values = new int[] 
{ 
    1, 
    2, 
    3, 
    5, 
    7 
}; 

Dictionary<int, string> dictionary = 
      values.ToDictionary(key => key, val => (val % 2 == 1) ? "Odd" : "Even"); 

// Display all keys and values. 
foreach (KeyValuePair<int, string> pair in dictionary) 
{ 
    Console.WriteLine(pair); 
} 

輸出是:

[1, Odd] 
[2, Even] 
[3, Odd] 
[5, Odd] 
[7, Odd] 

欲使用同樣做到這一點在F# ToDictionary,並且有這個至今:

let values = [| 1; 2; 3; 5; 7 |] 

let dictionary = values.ToDictionary(???) 

// Display all keys and values. 
for d in dictionary do 
    printfn "%d %s" d.Key d.Value 

但我會怎麼寫裏面ToDictionary邏輯?

+0

@Jim Garrison:我嘗試了丹尼爾的回答,它工作。 – brinch

回答

4

像這樣:

ToDictionary(id, fun v -> if v % 2 = 1 then "Odd" else "Even") 
+0

謝謝!所以第一個參數必須被稱爲「ID」呢? – brinch

+2

編號'id'是一個內置函數,相當於'fun x - > x'。請參閱[MSDN上的文檔](https://msdn.microsoft.com/en-us/library/ee353607.aspx)。 – Daniel

+1

如果我使用「id」作爲第一個參數,它會起作用。但如果我用「有趣的關鍵 - >鍵」輸出替換你的「ID」不再正確。 – brinch

11

你當然可以使用從F#ToDictionary(和所有其他LINQ方法),但有時它是更地道使用的功能從F#庫。是創建從包含鍵和值的元組的字典(創建元組的F#庫函數使用

let values = [| 1; 2; 3; 5; 7 |] 
let dictionary = dict [ for v in values -> v, if v % 2 = 1 then "Odd" else "Even" ] 

這裏dict

如果我vanted創建這本詞典,我會使用這樣的事情,,所以我們使用v作爲鍵和一個字符串作爲值)。

+2

要使用'dict'你必須添加'打開ExtraTopLevelOperators'。在這種情況下,字典將是不可變的。IDictionary ':'Add()','Remove()'等會拋出異常。 – Petr

+0

要獲得'Dictionary'而不是'IDictionary',你可以使用'Dictionary'構造函數,例如:'new Dictionary (dictionary)'' – burzhuy