F#中是否有字典的构造函数(它接受一个序列/列表作为输入,并输出一个字典)?我已经写了下面的代码来做我想做的事情,但我只是好奇它可能已经实现了(所以我不需要自己实现它)
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"}
非常感谢。
发布于 2017-10-09 09:55:16
dict函数的签名如下:
dict : seq<'Key * 'Value> -> IDictionary<'Key,'Value>
所以它接受一个键值序列作为输入。这里的关键是给它一个键值序列。在您的例子中,您可以使用map而不是iter。代码行将是相似的,但这是一种更实用的方式。
aList
|> Seq.map (fun a -> keyFunc a, valueFunc a )
|> dict
编辑
正如TheQuickBrownFox在评论中指出的那样,dict函数生成一个只读字典。
发布于 2017-10-09 10:11:02
我建议你只使用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)
https://stackoverflow.com/questions/46643061
复制相似问题