F#Seq差异

时间:2009-07-21 09:17:21

标签: f#

给出两个序列,如何获得属于这两个序列的所有元素或者其中一个元素所特有的所有元素?

示例:

let a = [1..10]
let b = [3; 5; 7]

如何计算3 5和7(所有元素 common 到列表中)和1,2,4,6,8,9,10(所有元素 not共同的

由于

3 个答案:

答案 0 :(得分:11)

您想要做的只不过是intersectiondifference(或相对补充)的简单设定操作。

F#有Set模块来帮助我们。这应该做的工作:

let a = [1 .. 10]
let b = [3; 5; 7]

let intersection = Set.intersect (Set.ofList a) (Set.ofList b)
let difference = (Set.ofList a) - (Set.ofList b)

如果愿意,您当然可以使用Set.toList将结果转换回列表。

正如Mehrdad所指出的,这可以使用LINQ(或者甚至是BCL中的HashSet类)来完成,但这里的方法似乎最符合F#语言的精神(当然是最好的)语法上,也可能是效率最高的。)

答案 1 :(得分:8)

稍微紧凑:

let a = set [0;1;2;3]
let b = set [2;3;4;5]
let c = a - b
let d = b - a
let e = Set.intersect a b
let f = a + b
> 
val c : Set<int> = seq [0; 1]
val d : Set<int> = seq [4; 5]
val e : Set<int> = seq [2; 3]
val f : Set<int> = seq [0; 1; 2; 3; ...]

丹尼

答案 2 :(得分:4)

不是F# - 我知道的方式。您始终可以使用.NET库。 seq<T>只是IEnumerable<T>,没什么特别的:

let diff = System.Linq.Enumerable.Except(seq1, seq2); // seq1 - seq2
let intersect = System.Linq.Enumerable.Intersect(seq1, seq2);
let symdiff = System.Linq.Enumerable.Union(System.Linq.Enumerable.Except(seq1, seq2), System.Linq.Enumerable.Except(seq2, seq1));