我有以下要求:根据第二个数组中元素的外观从第一个数组中获取元组数组:
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)
不幸的是,总数和变化具有不同数量的要素; 因此,我找不到一种简单的方法来获得我需要的元素.
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)
| 归档时间: |
|
| 查看次数: |
166 次 |
| 最近记录: |