F#/ .NET:向List <T>数组添加一个元素

dia*_*pha 2 .net f#

我有以下F#代码:

let list = Array.create 5 (new ResizeArray<char>())
list.[0].Add('c')
printfn "%A" list
Run Code Online (Sandbox Code Playgroud)

这是FSI控制台中的输出:

[|seq ['c']; seq ['c']; seq ['c']; seq ['c']; seq ['c']|]
Run Code Online (Sandbox Code Playgroud)

对我来说似乎很奇怪,因为我试图仅将'c'添加到第一个索引,但它似乎添加到数组中的所有索引.我究竟做错了什么?

Moh*_*ain 5

list是一个包含5个元素的数组,但每个元素都引用相同的列表.您可以使用以下代码进行检查:

let d = list.[0].Equals(list.[1])
Run Code Online (Sandbox Code Playgroud)

d 将是真的.

这是因为您正在初始化列表的方式 - 您正在创建一个包含5个元素的列表,其中所有5个元素都是相同的值.

因此,当您执行此操作时list.[0].Add('c'),它会正确地将元素附加到数组中的第一个列表,但由于所有元素都引用相同的列表,因此它似乎将它附加到每个元素.

您可以使用预期结果初始化列表(每个元素引用不同的列表):

let list = [| for i in 1 .. 5 -> new ResizeArray<char>() |]
Run Code Online (Sandbox Code Playgroud)

正如ildjarn所说,这是一种更好的方法:

let list = Array.init 5 (fun _ -> ResizeArray())
Run Code Online (Sandbox Code Playgroud)

  • 或更具惯用性(IMO),`Array.init 5(fun _ - > ResizeArray())`. (4认同)