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

时间:2009-11-22 15:32:24

标签: f#

我现在正在尝试这个,但我还没有完全找到方法签名......有人吗? messages是seq [string]

的字段
let messageString = List.reduce(messages, fun (m1, m2) -> m1 + m2 + Environment.NewLine)

5 个答案:

答案 0 :(得分:33)

> String.concat " " ["Juliet"; "is"; "awesome!"];;
val it : string = "Juliet is awesome!"

答案 1 :(得分:32)

不完全是您要找的,但

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 :(得分:2)

除非你需要做更高级的格式化,否则我会使用String.concat。然后我会使用StringBuilder。

(StringBuilder(), [ "one"; "two"; "three" ])
||> Seq.fold (fun sb str -> sb.AppendFormat("{0}\n", str))

答案 3 :(得分:1)

System.String.Join(Environment.NewLine, List.to_array messages)

或使用你的折叠(注意它效率低得多)

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

答案 4 :(得分:1)

还有一条评论,

当你使用字符串时,最好使用标准的字符串函数。

以下代码适用于EulerProject问题40.

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的每次迭代都会创建一个新的长字符串。