说您有一个字符串列表:[“ 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的功能,因为这似乎是一个基本的用例,我只是想不出它的名字是什么,或者用什么名字来搜索它。
A fold
从初始状态开始递归地将折叠功能应用于列表的所有值,在这种情况下您不希望使用初始状态。
使用表头作为其开始状态的reduce更为简单:
listOfThings |> List.reduce (fun sum cur -> sum + "," + cur) // "a,b,c"
一个小的缺点是,由于它使用列表头,因此用空列表调用reduce将会失败。您可以通过检查空白列表来缓解这种情况。
但是,最有效的方法是使用String.Join
,内部使用StringBuilder
,而reduce
为每个呼叫分配一个新的字符串:
String.Join(",", listOfThings) // "a,b,c"