我有字符串,我想要切断给定长度为n的子串数组。我对余数不感兴趣(如果字符串的长度不能除以n而没有余数)
let ChopString (myString : string) n =
let res =
seq{
for i = 0 to myString.Length / n - 1 do
yield( String.sub myString (i*n) n )
}
|> Seq.to_array
res
这是我能做的最好的事情。它看起来很难看。
是否有更好/更短的版本,可能没有for循环?
答案 0 :(得分:9)
stringInstance.[start..end]
比String.sub
更具可读性。这就是我想出的:
let chop (input : string) len =
seq { for start in 0 .. len .. input.Length - 1
do yield input.[start..start + len - 1] }
|> Seq.toArray
或者您可以使用:
let chop (input : string) len =
Array.init (input.Length / len) (fun index ->
let start = index * len
input.[start..start + len - 1])
答案 1 :(得分:0)
Craig Stunz在这里留下的答案现在已经丢失了。无论如何,他指出article about F#有两个字符串操作函数:explode
和implode
。这两个功能来自标准ML库。这是代码:
let rec explode str =
let len = String.length str in
if len=0 then [] else
(String.sub str 0 1) :: explode (String.sub str 1 (len-1))
let rec implode lst = match lst with
[] -> ""
| x1 :: x2 -> x1 ^ implode x2
explode
将字符串切换到字符串列表中,其中每个字符串都是一个字符
implode
相反 - 将字符串列表连接成一个字符串
这两个函数都是递归的,因此比较性能会很有趣。