如何将字符串拆分为F sharp中的字符列表

时间:2017-08-25 10:20:48

标签: f# f#-interactive

如果我想将单词“Hello”拆分为字符列表,例如,如何将字符串拆分为F sharp中的字符列表。

"Hello" ->['H';'e';'l';'l';'o']

我尝试了拆分([| |]),但它只根据传入的参数拆分字符串。

我试过这个,但它仍然无效

let splitChar (text:string) = 
    [for c in text ->c] 

let splitChar (text:string) = 
    [for c in text do yield c] 

4 个答案:

答案 0 :(得分:14)

您可以使用Seq.toList将字符串转换为字符列表:

Seq.toList "Hello"

答案 1 :(得分:6)

字符串本质上是一系列字符,因为implements IEnumerable<char>。在内部,字符串是char值的数组。该数组通过Chars索引器公开。

您可以对字符串使用任何Seq方法,例如:

"abc" |> Seq.iter (fun x->printfn "%c" x)

个别角色也可用

您还可以使用String module的优化功能:

"abc" |> String.iter (fun x->printfn "%c" x)

String模块使用String类的方法来提高性能。例如,String.length函数是String.Length属性的别名,因此它不必迭代Seq之类的所有字符:

    let length (str:string) =
        let str = emptyIfNull str
        str.Length

其他功能,例如String.iter,直接使用Chars索引器:

    let iter (f : (char -> unit)) (str:string) =
        let str = emptyIfNull str
        for i = 0 to str.Length - 1 do
            f str.[i] 

答案 2 :(得分:1)

在.NET中,您可以使用String.ToCharArray方法。要返回String,您可以使用String(Char[])现在使用构造函数作为函数的F#。

"Hello".ToCharArray() |> List.ofArray

使用F#Array模块可能会有更好的性能。我猜List.ofArrayList.ofSeq更有效率。如果这不重要,与Chad的答案类似,F#惯用的方式是:

"Hello" |> List.ofSeq

答案 3 :(得分:1)

我注意到有时我最初会想先将某些内容拆分为char数组或列表的情况-但我应该更简洁一些。

let msg = "hello-world"

let resultA = 
    msg.[0..0].ToUpper() + msg.[1..].Replace('-', ' ')

let resultB = 
    Seq.toList (msg)
    |> (fun list -> (string list.Head).ToUpper() + (String.Concat(list.Tail)).Replace('-', ' '))

// val resultA : string = "Hello world"
// val resultB : string = "Hello world"

我认为'resultA'方法更好。