如何让ToDictionary在F#中工作?

bri*_*nch 6 c# linq f#

我有这个C#示例,它将从整数数组创建奇数和偶数的字典:

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);
}
Run Code Online (Sandbox Code Playgroud)

输出是:

[1, Odd]
[2, Even]
[3, Odd]
[5, Odd]
[7, Odd]
Run Code Online (Sandbox Code Playgroud)

我希望在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
Run Code Online (Sandbox Code Playgroud)

但是我如何在ToDictionary中编写逻辑?

Tom*_*cek 12

您当然可以使用ToDictionaryF#中的(以及所有其他LINQ方法),但有时使用F#库中的函数更为惯用.

如果我想要创建这个字典,我会使用这样的东西:

let values = [| 1; 2; 3; 5; 7 |]
let dictionary = dict [ for v in values -> v, if v % 2 = 1 then "Odd" else "Even" ]
Run Code Online (Sandbox Code Playgroud)

dict是一个F#库函数,它从包含键和值的元组创建一个字典(元组是使用创建的,,所以我们v用作键,字符串作为值).

  • 要使用`dict`,你必须添加`open ExtraTopLevelOperators`.同样在这种情况下,字典将是不可变的`IDictionary <int,string>`:`Add()`,`Remove()`等会抛出异常. (3认同)

Dan*_*iel 4

像这样:

ToDictionary(id, fun v -> if v % 2 = 1 then "Odd" else "Even")
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,您必须将 `fun key -&gt; key` 放在括号中: `ToDictionary((fun key -&gt; key), fun v -&gt; if v % 2 = 1 then "Odd" else "Even")` (4认同)
  • 不。 `id` 是一个内置函数,相当于 `fun x -&gt; x`。请参阅 [MSDN 上的文档](https://msdn.microsoft.com/en-us/library/ee353607.aspx)。 (2认同)
  • 如果我使用“id”作为第一个参数,它会起作用。但是,如果我用“fun key -&gt; key”替换你的“id”,输出就不再正确。 (2认同)