如果你不關心重複,那麼你可以寫這個使用F#集:
// Elements that are in array1, but not in array0
set array1 - set array0
// Elements that are in both arrays (which is what your sample returns)
Set.intersect (set array1) (set array0)
在這兩種情況下,你得到一個新的set<int>
,這也是seq<int>
,所以你可以迭代它或使用Array.ofSeq
將它變回數組。
如果您想保留重複項(如果array1
中有重複項,則多次返回該元素),那麼我認爲您擁有的是好的。如果你想對一個比較多個陣列,那麼它會是有意義的轉array0
到字典中更有效地查找:
let inZero =
let set0 = set array0
set0.Contains
// Elements from array1 that are also in array0 (returns multiple
// copies of the same element if it appears repeatedly in array1)
array1 |> Array.filter inZero
要設置的轉換有一定的成本,但它減少了查找時間。所以,根據你如何使用這個陣列的大小,這將具有不同的性能特徵。但代碼看起來更好,所以這將是我的默認選擇。
除此之外,現在刪除的建議使用'Enumerable.Except'的答案聽起來也是一個不錯的選擇。 – 2015-02-23 20:05:49
如果你準備等到F#4.0(或者可能是4.1),那麼有一個對Array.Except打開的拉取請求:) https://github.com/Microsoft/visualfsharp/pull/253 – 2015-02-23 20:13:32