.net 在F中将枚举转换为列表、序列或泛型集合类型#
我有一个类型是.net 在F中将枚举转换为列表、序列或泛型集合类型#,.net,f#,.net,F#,我有一个类型是字典列表或并发字典列表。我正试图创建一个get_nodes函数,但是当我从字典和concurrentdirectionary调用.Values时,函数返回不同的类型 因此,我需要以某种方式将这两种类型转换为相同的类型,以便F#编译 Dictionary.Values给出的类型是Dictionary'2.ValueCollection> 我发现这两种类型都有一个“GetEnumerator()”函数。我需要做的是以某种方式将枚举数转换为seq或list等 这是我的密码: sta
字典列表
或并发字典列表
。我正试图创建一个get_nodes
函数,但是当我从字典和concurrentdirectionary
调用.Values
时,函数返回不同的类型
因此,我需要以某种方式将这两种类型转换为相同的类型,以便F#编译
Dictionary.Values
给出的类型是Dictionary'2.ValueCollection>
我发现这两种类型都有一个“GetEnumerator()”函数。我需要做的是以某种方式将枚举数转换为seq或list等
这是我的密码:
static member get_nodes (g:Graph<'a>) =
match g with
| Dictionary_Graph(nd,el) -> let n = nd.Values
let enum = n.GetEnumerator()
| ConcurrentDictionary_Graph(nd,el) -> let n = nd.Values
let enum = n.GetEnumerator()
static member get_nodes(g:Graph您可能习惯于C#,它会自动将ValueCollection向上转换为ICollection(ValueCollection实现了ICollection)。F#不会这样做,因此您必须手动将Dictionary.Values的结果转换为ICollection
let n = nd.Values :> ICollection<Node<'a>>
希望他们不会"T添加它。显式强制转换代码更好、更清晰。自动强制转换和所有神奇的东西使代码更难推理,不仅仅是F#类型推理,也包括开发类型推理。@Gustavo.不同意。尝试使用Automapper或RavenDB之类的库,它们期望表达式
用于类型安全属性规范。Beca使用没有向上转换功能,如果没有,您无法在F#中使用它。@KaseySpeakman:看起来大部分代码都是用于将F#引号转换为LINQ表达式的……不确定这与自动转换有什么关系。@Daniel,这是他们选择的解决问题的方法。但是,如果您尝试使用更基本的方法传入fun x->x.Property
,编译失败(属性类型为obj
的罕见情况除外)。并添加x.Property:>obj
更改表达式类型,当库解析表达式时,该表达式需要属性访问,而不是强制转换。要使其工作,您必须手动构造表达式并将其传入…或使用备用(非类型安全)方法。但并非所有库都提供此方法。
static member get_nodes (g:Graph<'a>) =
match g with
| Dictionary_Graph(nd,el) ->
nd.Values :> ICollection<Node<'a>>
| ConcurrentDictionary_Graph(nd,el) ->
nd.Values
myGraph
|> Graph.get_nodes
|> Seq.iter (fun x -> printfn "%A" x)