在F#中检索具有不同数量元素的元组数组

Joh*_*ohn 2 f#

我有以下要求:根据第二个数组中元素的外观从第一个数组中获取元组数组:

let totals = [| ("old1", "new1"); ("old2", "new2");  ("old3", "new3"); ("old4", "new4")  |]
let changes = [| "new1"; "new4" |]
Run Code Online (Sandbox Code Playgroud)

我想要这个:

let updates = [| ("old1", "new1"); ("old4", "new4") |]
Run Code Online (Sandbox Code Playgroud)

如果两个数组总数和更改具有相同的长度,那么我认为这很容易:

let updates = Array.zip  changes totals
            |> Array.choose(fun (a, B) -> if a = fst(B) then Some (B) else None)
Run Code Online (Sandbox Code Playgroud)

不幸的是,总数和变化具有不同数量的要素; 因此,我找不到一种简单的方法来获得我需要的元素.

Tom*_*cek 6

pad发布的解决方案是正确的,对于少量元素可以正常工作changes.但是,它会changes为每个元素迭代数组total,因此对于大型数组来说可能效率低下.

作为替代方案,您可以changes转换为F#set类型,以允许更有效的成员资格测试:

// Create set containing 'changes'
let changesSet = Set.ofArray changes

// Filter totals where the second element is in 'changesSet'
totals |> Array.filter (fun (_, v) -> changesSet.Contains(v))

// Same thing using function composition
totals |> Array.filter (snd >> changesSet.Contains)
Run Code Online (Sandbox Code Playgroud)