能否用F#查询表达式筛选不在指定序列中的项?
用F#查询表达式实现序列差集操作
当然可以用F#的查询表达式实现这个功能,本质上是实现两个序列的差集(即s1中存在但s2中不存在的元素)。下面是对应的实现代码:
let s1 = seq { 1..3 } let s2 = seq { 3..4 } query { for x in s1 do where (not (query { for y in s2 do exists (y = x) })) select x } |> Seq.iter (fun x -> printfn $"{x}")
这段代码的逻辑和你提供的原生Seq操作完全一致:
- 遍历s1中的每个元素
x - 通过嵌套的查询表达式判断
x是否不存在于s2中(用exists替代原来的forall取反,逻辑更直观) - 筛选符合条件的元素并输出,最终同样会打印1和2
另外,如果你追求更简洁的写法,也可以借助集合的差集操作(先转成Set再计算差集,再转回序列),不过这不属于查询表达式的范畴:
Set.difference (Set.ofSeq s1) (Set.ofSeq s2) |> Seq.iter (printfn "%d")
内容的提问来源于stack exchange,提问作者Matthew MacFarland
相关产品推荐
相关产品推荐

