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"}
非常感谢。
答案 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)