如何将字符列表更改为字符串?

Ono*_*cci 19 string f#

在F#中,我想将字符列表转换为字符串.请考虑以下代码:

let lChars = ['a';'b';'c']
Run Code Online (Sandbox Code Playgroud)

如果我只是做lChars.ToString,我会得到"['a';'b';'c']".我想要获得"abc".我意识到我可能会做一个List.reduce来获得我正在寻找的效果,但似乎应该有一些原始内置到库中来执行此操作.

为了给出一点上下文,我正在对字符串中的单个字符进行一些操作,当我完成后,我想显示结果字符串.

我试过谷歌搜索这个没有喜悦的方式.我是否需要咬紧牙关并构建一个List.reduce表达式来进行这种转换,还是有一些更优雅的方法来做到这一点?

Jar*_*Par 31

你有没有尝试过

System.String.Concat(Array.ofList(lChars))
Run Code Online (Sandbox Code Playgroud)

  • 新的System.String(lchars |> Array.of_list)也可以正常工作. (12认同)
  • 如果您使用的是.NET 4或更高版本,那么`System.String.Concat(lChars)`也可以解决问题. (7认同)
  • `let result = lChars |> Array.ofList |> String`在F#4.0中也有效 (7认同)

cfe*_*ern 6

有多少种方法可以在F#中构建字符串?这是另一个:

let chars = ['H';'e';'l';'l';'o';',';' ';'w';'o';'r';'l';'d';'!']

//Using an array builder
let hw1 = new string [|for c in chars -> c|]

//StringBuilder-Lisp-like approach
open System.Text
let hw2 = 
    string (List.fold (fun (sb:StringBuilder) (c:char) -> sb.Append(c)) 
                      (new StringBuilder())
                       chars)

//Continuation passing style
let hw3 =
    let rec aux L k =
        match L with
        | [] -> k ""
        | h::t -> aux t (fun rest -> k (string h + rest) )
    aux chars id
Run Code Online (Sandbox Code Playgroud)

编辑:时间可能很有趣?我将hw1..3转换为函数,并为它们提供了500000个随机字符列表:

  • hw1:51ms
  • hw2:16ms
  • hw3:呃......长得够长胡子?我认为它只是吃掉了我的所有记忆.