在F#中将字符串添加到字符串数组

6

I have a string in F#:

 let name = "Someone"

我还有一个字符串数组:

 let mutable arraysOfNames : string[] = [||]

我想将字符串名称添加到数组arrayOfNames中。 我该如何做? 它不必是一个数组,它可以是Sequence或任何其他集合,我可以检查它是否为空。

1
为什么不使用列表来构建集合,然后在需要时在结尾处创建数组呢? - Steve
4个回答

6
向长度为零的数组添加项目是不可能的。您能做的只是创建一个包含该项的新数组。目前接受的答案,使用Array.append,不会修改输入数组;相反,它创建一个包含两个输入数组元素的新数组。如果您重复调用附加来向数组添加单个元素,将极其低效地使用内存。
相反,在F#中,更明智的做法是使用F#的列表类型,或者对于某些应用程序,使用ResizeArray<'T>(这是F#对标准.NET列表的名称)。如果您实际需要数组中的项目(例如,因为您必须将它们传递给参数为数组类型的方法),那么请按照Steve在他的评论中建议的做法。一旦您已经建立了集合,请调用List.toArray或Array.ofList(如果您正在使用F#列表),或者调用ToArray()实例方法(如果您正在使用ResizeArray)。
示例1:
let mutable listOfNames : string list = []
listOfNames <- "Alice" :: listOfNames
listOfNames <- "Bob" :: listOfNames
//...
let names = listOfNames |> List.toArray

示例2:

let resizeArrayOfNames = ResizeArray<string>()
resizeArrayOfNames.Add "Alice"
resizeArrayOfNames.Add "Bob"
let names = resizeArrayOfNames.ToArray()

请注意,在第一个示例中,您将以相反的顺序获取名称;如果您需要按照添加顺序获取它们,则需要:
let names = listOfNames |> List.rev |> List.toArray

3

对于任何在F#中作为IEnumerable<T>别名的Seq,您可以编写以下函数:

let addToSequence aseq elm =  Seq.append aseq <| Seq.singleton elm 

并且这样使用:

let withSomeone = addToSequence [||] "Someone" 

在获取结果序列后,您可以使用Seq.toArraySeq.toList


2

请查看Array.append

// 签名: Array.append : 'T [] -> 'T [] -> 'T []

// 用法: Array.append array1 array2

因此,在您的情况下,您可以像这样使用它:

let name = "someone"
let mutable arrayOfNames = Array.append [|"test"; "abc"|] [|name|]
printfn "%A" arrayOfNames
//[|"test"; "abc"; "someone"|]

所以您只需将字符串转换为数组(使用 [|string|])。由于Array包含append函数,因此您可以通过这种方式将字符串附加到数组中。


0

您可以在使用可变数组时,使用Array.append方法:

let mutable my_array = [||]
for i in 0 .. array_size do
    my_array  <- [|i|] |> Array.append my_array 
    // my_array  <- Array.append my_array [|i|]
printfn "my array is: %A" my_array

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接