与えられた2つのシーケンスは、両方のシーケンスに属するすべての要素またはそのうちの1つに固有のすべての要素を取得する方法を教えてください。F#Seq diff
例:
let a = [1..10]
let b = [3; 5; 7]
どのように3〜5及び7(リストの両方にすべての要素共通)及び1、2、4、6、8、9、10(すべての計算ありません要素ない共通中)
おかげ
与えられた2つのシーケンスは、両方のシーケンスに属するすべての要素またはそのうちの1つに固有のすべての要素を取得する方法を教えてください。F#Seq diff
例:
let a = [1..10]
let b = [3; 5; 7]
どのように3〜5及び7(リストの両方にすべての要素共通)及び1、2、4、6、8、9、10(すべての計算ありません要素ない共通中)
おかげ
あなたが何をしたいのかはintersectionとdifference(または相対的補数)の簡単なセット演算以上のものではありません。
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#言語の精神の中で最もよく見えるでしょう(確かに、おそらく最も効率的です)。
ない私の知っている非常に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));
彼らはうまくいきますが、そのような一般的な作業のために独自のメソッド(またはエイリアス)を持たないシーケンスでは非常にうまく動作する言語にとっては奇妙だと思います... – pistacchio
合意。より多くのF#y方法があるかもしれません。ちょうどその可能性を述べた。より良い答えを待っています。 –
もう少しコンパクト:
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; ...]
ダニー
あなたが例を与えることができますか? – Dario