F# 我有两个不同长度的列表(列表a和列表b),如何获得一个包含列表a所有唯一元素的新列表?

F# 我有两个不同长度的列表(列表a和列表b),如何获得一个包含列表a所有唯一元素的新列表?,f#,F#,我有一个问题,我需要一个新的列表,包含列表a中的所有唯一元素,但问题是列表的长度不同 [ 1; 2; 4; 5 ] |> List.except [ 2; 3; 5 ] // [ 1; 4 ] 也就是说,下面应该做你想做的 let c = a |> List.except b 使现代化 正如@rcoy指出的,List.except只返回不同的元素,即 [ 1; 1 ] |> List.except [] = [ 1 ] // true 要保留副本,一个简单的方法是 let

我有一个问题,我需要一个新的列表,包含列表a中的所有唯一元素,但问题是列表的长度不同

[ 1; 2; 4; 5 ] |> List.except [ 2; 3; 5 ] // [ 1; 4 ]
也就是说,下面应该做你想做的

let c = a |> List.except b
使现代化 正如@rcoy指出的,List.except只返回不同的元素,即

[ 1; 1 ] |> List.except [] = [ 1 ] // true
要保留副本,一个简单的方法是

let b = [ 2 ]
let toRemove x = not(List.contains x b)
[ 1; 1; 2 ] |> List.filter toRemove // [ 1; 1 ]
根据b列表的大小和等效函数结构与参考,即遍历和比较的成本,更改数据结构可能是有益的。例如

open System.Collections.Generic
let b = [ 2 ]
let toRemove = HashSet(b)
[ 1; 1; 2 ] |> List.filter (fun x -> not(toRemove.Contains(x))) // [ 1; 1 ]
这与List.except在内部执行的操作类似

也就是说,下面应该做你想做的

let c = a |> List.except b
使现代化 正如@rcoy指出的,List.except只返回不同的元素,即

[ 1; 1 ] |> List.except [] = [ 1 ] // true
要保留副本,一个简单的方法是

let b = [ 2 ]
let toRemove x = not(List.contains x b)
[ 1; 1; 2 ] |> List.filter toRemove // [ 1; 1 ]
根据b列表的大小和等效函数结构与参考,即遍历和比较的成本,更改数据结构可能是有益的。例如

open System.Collections.Generic
let b = [ 2 ]
let toRemove = HashSet(b)
[ 1; 1; 2 ] |> List.filter (fun x -> not(toRemove.Contains(x))) // [ 1; 1 ]

与列表类似。除了内部操作。

您尝试过什么,问题出在哪里?为什么列表的长度是其中的一个因素?请提供一个代码示例,您到目前为止已经尝试了什么。根据您的描述,列表b没有任何相关性,您所需要的只是从列表a中删除重复项,因为有许多方法。提问时请查看此页面:我尝试了for循环模式匹配、List.exist等,但运气不好,因此farMaybe问题的表述可能不正确,但我需要比较两个列表以及列表b中没有的所有项目,我们应该温和地鼓励新人提出更完整的问题,而不是投反对票。这是一个友好的小社区。加上最初的F学习曲线是陡峭的,很难写出代码片段。你尝试过什么?问题出在哪里?为什么列表的长度是其中的一个因素?请提供一个代码示例,您到目前为止已经尝试了什么。根据您的描述,列表b没有任何相关性,您所需要的只是从列表a中删除重复项,因为有许多方法。提问时请查看此页面:我尝试了for循环模式匹配、List.exist等,但运气不好,因此farMaybe问题的表述可能不正确,但我需要比较两个列表以及列表b中没有的所有项目,我们应该温和地鼓励新人提出更完整的问题,而不是投反对票。这是一个友好的小社区。加上最初的F学习曲线是陡峭的,很难产生代码片段。这可能有一个令人惊讶的行为,即消除源代码列表的重复。使用List.where和List.exists可能是唯一的解决方法。这可能会导致对源列表进行重复数据消除的惊人行为。使用List.where和List.exists可能是唯一的解决方法。