F# 将字符串转换为F中的键值对#

F# 将字符串转换为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

给定一个字符串,例如

一: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


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
函数中处理故障