List / Seq中的F#Dictionary Builder

时间:2017-10-09 09:27:04

标签: dictionary f#

F#中是否有Dictionary的构造函数(将Seq / List作为输入,并输出一个Dictionary)?我写了下面的代码,它做了我想要的,但我只是好奇,也许它已经实现了(所以我不需要自己实现)

let DictionaryBuilder (keyFunc:'a->'b) (valueFunc:'a->'c) aList =
    let dict = new Dictionary<'b,'c>()
    aList 
    |> Seq.iter (fun a -> dict.Add(keyFunc a, valueFunc a ))
    dict    // return

我知道在C#中你可以使用.ToDictionary(使用System.Linq)

// using System.Collections.Generic;
// using System.Linq;
List<string> example = new List<string> {"a","b","c"};
Dictionary<string,string> output = example.ToDictionary(x => x+"Key", x => x+"Value");
// Output: {"aKey": "aValue", "bKey": "bValue", "cKey": "cValue"}

非常感谢。

2 个答案:

答案 0 :(得分:1)

dict的签名功能如下:

dict : seq<'Key * 'Value> -> IDictionary<'Key,'Value> 

因此它需要一个键值序列作为输入。这里的关键是给它一个关键的值序列。在您的情况下,您可以使用map而不是iter。代码行将类似,但它更具功能性。

aList 
|> Seq.map (fun a -> keyFunc a, valueFunc a )
|> dict

修改

正如TheQuickBrownFox在评论中指出的那样,dict函数会生成一个只读字典。

答案 1 :(得分:1)

我建议你只使用LINQ:

open System.Linq
[1; 2; 3].ToDictionary(id, (*) 2)

如果您更倾向于使用函数而不是扩展方法,请直接使用它或在辅助函数中使用它。

module Seq =
    open System.Linq
    let toDictionary (f:'s -> 'k) (g:'s -> 'v) (xs:_ seq) = xs.ToDictionary(f, g)