如果你不关心重复,那么你可以写这个使用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