2009-07-21 16 views
13

与えられた2つのシーケンスは、両方のシーケンスに属するすべての要素またはそのうちの1つに固有のすべての要素を取得する方法を教えてください。F#Seq diff

例:

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

どのように3〜5及び7(リストの両方にすべての要素共通)及び1、2、4、6、8、9、10(すべての計算ありません要素ない共通中)

おかげ

+0

あなたが例を与えることができますか? – Dario

答えて

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

何かについて考えると、リストをセットに変換することによって、別個の値だけが保持されます(セットの定義)。 Mehrdad(Linq-Enumerableメソッドを使用する)によって与えられた答えは、すべての値を保持します。時にはこれは問題ではないが、私はそれを指摘したがっている。 – polkduran

+1

(Set.of_list a) - (Set.of_list b)は可換ではありません – Indy9000

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

+1

合意。より多くのF#y方法があるかもしれません。ちょうどその可能性を述べた。より良い答えを待っています。 –

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

ダニー

関連する問題