F# 将字符串转换为F中的键值对#
给定一个字符串,例如 一:1.0 |二:2.0 |三:3.0 我们如何创建字符串形式的字典:floatF# 将字符串转换为F中的键值对#,f#,F#,给定一个字符串,例如 一:1.0 |二:2.0 |三:3.0 我们如何创建字符串形式的字典:float open System open System.Collections.Generic let ofSeq (src:seq<'a * 'b>) = // from fssnip let d = new Dictionary<'a, 'b>() for (k,v) in src do d.Add(k,v) d le
open System
open System.Collections.Generic
let ofSeq (src:seq<'a * 'b>) =
// from fssnip
let d = new Dictionary<'a, 'b>()
for (k,v) in src do
d.Add(k,v)
d
let msg = "one:1.0|two:2.0|three:3.0"
let msgseq = msg.Split[|'|'|] |> Array.toSeq |> Seq.map (fun i -> i.Split(':'))
let d = ofSeq msgseq // The type ''a * 'b' does not match the type 'string []'
开放系统
open System.Collections.Generic
let of seq(src:seq)=
//来自fssnip
设d=新字典()
对于src-do中的(k,v)
d、 加(k,v)
D
让msg=“一:1.0 |二:2.0 |三:3.0”
让msgseq=msg.Split[|'|'|]|>Array.toSeq |>Seq.map(fun i->i.Split(':'))
设d=ofSeq msgseq//类型“a*”b与类型“字符串[]”不匹配
该操作将处于一个紧密的循环内,因此效率将是一个加号。虽然我也希望看到一个简单的解决方案,只是为了得到我的F#方位
谢谢。不确定性能方面,但如果您确定您的输入,并且能够“承受”一个警告,您可以使用:
let d =
msg.Split '|'
|> Array.map (fun s -> let [|key; value|] (*warning here*) = s.Split ':' in key, value)
|> dict
|> System.Collections.Generic.Dictionary // optional if a IDictionary<string, string> suffice
让d=
msg.Split'|'
|>Array.map(fun s->let[| key;value |](*此处警告*)=s.Split':'在key,value中)
|>口述
|>System.Collections.Generic.Dictionary//如果IDictionary足够,则为可选
像这样的东西怎么样:
let msg = "one:1.0|two:2.0|three:3.0"
let splitKeyVal (str : string) =
match str.Split(':') with
|[|key; value|] -> (key, System.Double.Parse(value))
|_ -> invalidArg "str" "str must have the format key:value"
let createDictionary (str : string) =
str.Split('|')
|> Array.map (splitKeyVal)
|> dict
|> System.Collections.Generic.Dictionary
如果您不介意使用IDictionary
返回类型,可以删除System.Collections.Generic.Dictionary
如果您希望splitKeyVal
函数失败,那么最好将其表示为返回选项的函数,例如:
let splitKeyVal (str : string) =
match str.Split(':') with
|[|key; valueStr|] ->
match System.Double.TryParse(valueStr) with
|true, value -> Some (key, value)
|false, _ -> None
|_ -> None
但是,您还必须决定如何在createDictionary
函数中处理故障