假设您有一个字符串列表:[“ a”; “ b”; “ c”],您想将其转换为单个字符串,如下所示:“ a,b,c”注意最后一个逗号丢失。我发现这种情况对我来说又一次出现,想一想所有不允许尾随逗号出现的编程语言,并且您正在构建某种代码生成器。我通常会得到如下结果:
let listOfThings = ["a";"b";"c"]
let folded =
listOfThings
|> List.map (fun i -> i + ",")
|> List.fold (+) ""
|> (fun s -> s.Substring(0, s.Length - 1))
我觉得已经有一些类似fold的功能,因为这似乎是一个基本的用例,我只是想不出它的名字是什么,或者用什么名字来搜索它。
fold
从初始状态开始,A递归将折叠功能应用于列表的所有值,在这种情况下,您不需要使用初始状态。
使用reduce会更简单,reduce会将列表的头作为起始状态:
listOfThings |> List.reduce (fun sum cur -> sum + "," + cur) // "a,b,c"
一个较小的缺点是,由于它使用列表头,因此使用空列表调用reduce将会失败。您可以通过检查空白列表来缓解这种情况。
如您所述,没有任何内置函数,我们将为最后一个元素跳过尾随逗号的添加:
let rec join = function
| [] -> ""
| [x] -> x
| x::xs -> x + "," + join xs
["a"; "b"; "c"] |> join // a,b,c
但是,最有效的方法是使用String.Join
内部使用的方法StringBuilder
,同时reduce
为每个调用分配一个新的字符串:
String.Join(",", listOfThings) // "a,b,c"
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句