代码之家  ›  专栏  ›  技术社区  ›  mwjackson

如何连接F#中的字符串列表?

f#
  •  15
  • mwjackson  · 技术社区  · 16 年前

    我现在正在尝试,但是我还没有完全弄清楚方法签名。。。任何人messages是seq[string]的字段

    let messageString = List.reduce(messages, fun (m1, m2) -> m1 + m2 + Environment.NewLine)
    
    5 回复  |  直到 16 年前
        1
  •  43
  •   Lynn    10 年前

    不完全是你要找的,但是

    let strings = [| "one"; "two"; "three" |]
    let r = System.String.Concat(strings)
    printfn "%s" r
    

    你能行

    let strings = [ "one"; "two"; "three" ]
    let r = strings |> List.fold (+) ""
    printfn "%s" r
    

    let strings = [ "one"; "two"; "three" ]
    let r = strings |> List.fold (fun r s -> r + s + "\n") ""
    printfn "%s" r
    
        2
  •  48
  •   Juliet    16 年前
    > String.concat " " ["Juliet"; "is"; "awesome!"];;
    val it : string = "Juliet is awesome!"
    
        3
  •  4
  •   gradbot    16 年前

    我会使用String.concat,除非您需要进行更高级的格式化,然后我会使用StringBuilder。

    (StringBuilder(), [ "one"; "two"; "three" ])
    ||> Seq.fold (fun sb str -> sb.AppendFormat("{0}\n", str))
    
        4
  •  2
  •   Yin Zhu    16 年前

    在处理字符串时,最好使用标准字符串函数。

    let problem40 =
        let str = {1..1000000} |> Seq.map string |> String.concat ""
        let l = [str.[0];str.[9];str.[99];str.[999];str.[9999];str.[99999];str.[999999];]
        l |> List.map (fun x-> (int x) - (int '0')) |> List.fold (*) 1
    

    如果上面程序的第二行使用fold而不是concat,那么速度会非常慢,因为fold的每次迭代都会创建一个新的长字符串。

        5
  •  1
  •   Dario    16 年前
    System.String.Join(Environment.NewLine, List.to_array messages)
    

    或者使用你的折叠(请注意,效率要低得多)

    List.reduce (fun a b -> a ^ Environment.NewLine ^ b) messages