F#中的集合初始化程序语法是什么?在C#中,您可以编写如下内容:
new Dictionary<string, int>() {
{"One", 1},
{"two", 2}}
Run Code Online (Sandbox Code Playgroud)
我如何在F#中做同样的事情?我想我可以使用自己的语法,但似乎应该有一个内置或标准的语法.
Dan*_*iel 73
要详细说明F#中的集合初始化,这里有几个例子:
只读字典
dict [ (1, "a"); (2, "b"); (3, "c") ]
Run Code Online (Sandbox Code Playgroud)
seq(IEnumerable <T>)
seq { 0 .. 99 }
Run Code Online (Sandbox Code Playgroud)
名单
[1; 2; 3; 4; 5]
Run Code Online (Sandbox Code Playgroud)
组
set [1; 2; 3; 4; 5]
Run Code Online (Sandbox Code Playgroud)
排列
[| 1; 2; 3; 4; 5 |]
Run Code Online (Sandbox Code Playgroud)
kvb*_*kvb 28
正如Jared所说,对于任意集合,没有内置的支持.但是,C#代码只是Add
方法调用的语法糖,因此您可以将其转换为:
let coll = MyCollectionType()
["One", 1; "Two", 2] |> Seq.iter coll.Add
Run Code Online (Sandbox Code Playgroud)
如果你想获得幻想,你可以创建一个inline
定义来进一步简化:
let inline initCollection s =
let coll = new ^t()
Seq.iter (fun (k,v) -> (^t : (member Add : 'a * 'b -> unit) coll, k, v)) s
coll
let d:System.Collections.Generic.Dictionary<_,_> = initCollection ["One",1; "Two",2]
Run Code Online (Sandbox Code Playgroud)
Jar*_*Par 12
我不相信F#有一个显式的集合初始化语法.但是,初始化F#集合通常很容易.例如
let map = [ ("One", 1); ("Two", 2) ] |> Map.ofSeq
Run Code Online (Sandbox Code Playgroud)
获取BCL集合通常有点困难,因为它们并不总是具有方便的转换功能. Dictionary<TKey, TValue>
但是可以工作,因为你可以使用LINQ方法
let map =
let list = [ ("One", 1); ("Two", 2) ]
System.Linq.Enumerable.ToDictionary(list, fst, snd)
Run Code Online (Sandbox Code Playgroud)
您可以使用相同的:
open System.Collections.Generic
Dictionary<int, string>(dict [ (1, "a"); (2, "b"); (3, "c") ])
Run Code Online (Sandbox Code Playgroud)
干杯。