我有以下 F# 代码:
let list = Array.create 5 (new ResizeArray<char>())
list.[0].Add('c')
printfn "%A" list
这是 FSI 控制台中的输出:
[|seq ['c']; seq ['c']; seq ['c']; seq ['c']; seq ['c']|]
对我来说似乎很奇怪,因为我试图仅将“c”添加到第一个索引,但它似乎添加到数组中的所有索引。我究竟做错了什么?
您list
是一个由 5 个元素组成的数组,但每个元素都引用同一个 list。您可以使用以下代码进行检查:
let d = list.[0].Equals(list.[1])
d
将是真的。
这是因为您初始化列表的方式 - 您正在创建一个包含 5 个元素的列表,其中所有 5 个元素的值都相同。
因此,当您执行 时list.[0].Add('c')
,它会正确地将元素附加到数组中的第一个列表,但是因为所有元素都引用同一个列表,所以它似乎将其附加到每个元素。
您可以这样做来初始化您的列表,并获得预期的结果(每个元素引用不同的列表):
let list = [| for i in 1 .. 5 -> new ResizeArray<char>() |]
正如 ildjarn 所说,这是一种更好的方法:
let list = Array.init 5 (fun _ -> ResizeArray())