F#Seq差异

pis*_*hio 13 f#

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

例:

let a = [1..10]
let b = [3; 5; 7]
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Nol*_*rin 12

你想要做的只不过是交集差异(或相对补充)的简单集合操作.

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)
Run Code Online (Sandbox Code Playgroud)

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

正如Mehrdad指出的那样,这可以使用LINQ(或者甚至是HashSetBCL中的类)来替代,但是这里的方法似乎最符合F#语言的精神(当然是最好的语法,也可能是效率最高的) ).


Dan*_*her 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; ...]
Run Code Online (Sandbox Code Playgroud)

丹尼


Meh*_*ari 5

我所知道的不是很 F#-y 的方式。您可以随时求助于 .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));
Run Code Online (Sandbox Code Playgroud)