2009-07-21 56 views
13

給出了兩個序列,如何獲得屬於這兩個序列的所有元素或其中一個元素唯一的所有元素?F#Seq diff

實施例:

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

如何計算3 5和7(所有元素共同到兩個列表)和1,2,4,6,8,9,10(所有的元素不常見

感謝

+0

你能舉個例子嗎? – Dario 2009-07-21 09:20:36

回答

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#語言的精神(當然這是最好的語法上的,並且可能也是最高效的)。

4

不太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)); 
+1

他們的工作,但我認爲這是一種語言,如此嚴重的序列沒有自己的方法(或別名)這樣一個共同的任務... – pistacchio 2009-07-21 09:32:22

+1

同意。可能會有更多的F#y方式。剛纔提到了可能性。等待更好的答案。 – 2009-07-21 09:36:14

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

丹尼