2013-03-01 68 views
2

我有以下的F#代碼:F#/ .NET:一個元素添加到列表的陣列<T>

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'添加到第一個索引,但它似乎添加到數組中的所有索引。我究竟做錯了什麼?

回答

5

您的list是一個由5個元素組成的數組,但每個元素都引用相同的列表。你可以用下面的代碼來檢查它:

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()) 
+0

謝謝。這是解決方案。 – dialAlpha 2013-03-01 21:43:52

+4

或更慣用(IMO),Array.init 5(fun _ - > ResizeArray())'。 – ildjarn 2013-03-01 21:44:35

+0

優秀的答案,那絕對會更好。我會補充一點。 – 2013-03-01 21:45:20