如果我想将单词“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]
答案 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.ofArray
比List.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'方法更好。