繁体   English   中英

F#Seq差异

[英]F# Seq diff

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

例:

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

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

谢谢

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

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#语言的精神(当然是最好的语法,也可能是效率最高的)太)。

稍微紧凑:

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; ...]

丹尼

不是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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM