找到FSharp中两个数组之间的差异

Jam*_*xon 3 f#

我有两个数组,我想找到第二个数组中不在第一个数组中的元素.

我写了以下代码:

let array0 = [|"A";"B";"C"|]
let array1 = [|"B";"D";"E"|]

let inZero letter = 
    array0 |> Array.tryFind(fun l -> if l = letter then true else false)

array1|> Array.filter(fun l -> inZero(l).IsSome)
Run Code Online (Sandbox Code Playgroud)

但我想知道FSharp是否存在更为惯用的东西.

提前致谢

Tom*_*cek 5

如果您不关心重复项,那么您可以使用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)
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,你都会得到一个新的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
Run Code Online (Sandbox Code Playgroud)

转换为set有一些成本,但它减少了查找时间.因此,根据您使用它的方式以及数组的大小,这将具有不同的性能特征.但代码看起来更好,所以这将是我的默认选择.