F#集合初始化器语法

srp*_*ish 34 f# inline

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)

  • 一个(挑剔的)样式偏好:我会把它放在一个`Collection`模块中并命名为`init`,因为`Collection.init [1; 2; 3]`读得很好. (6认同)

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)

  • 如果一个不可变的`IDictionary <K,V>`就足够了,你只需在列表前加上`dict`. (4认同)
  • ToDictionary转换可以简化:`System.Linq.Enumerable.ToDictionary(list,fst,snd)` (2认同)

foo*_*foo 6

您可以使用相同的:

open System.Collections.Generic

Dictionary<int, string>(dict [ (1, "a"); (2, "b"); (3, "c") ])
Run Code Online (Sandbox Code Playgroud)

干杯。

  • 当然你的意思是`Dictionary&lt;int, string&gt;`。不过这个语法还不错! (4认同)