2

我有以下 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”添加到第一个索引,但它似乎添加到数组中的所有索引。我究竟做错了什么?

4

1 回答 1

5

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())
于 2013-03-01T21:34:22.613 回答