2009-07-21 9 views
13

दो अनुक्रम दिए गए, अनुक्रमों या सभी तत्वों में से प्रत्येक के लिए अद्वितीय सभी तत्व कैसे प्राप्त करें?एफ # सीईसी diff

उदाहरण:

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

मैं कैसे की गणना करते हैं 3 5 और 7 (सभी तत्वों आम दोनों सूची) और 1, 2, 4, 6, 8, 9, 10 (सभी तत्वों आम में नहीं)

धन्यवाद

+0

आपको एक उदाहरण दे सकते हैं? – Dario

उत्तर

11

क्या आप क्या करना चाहते intersection और difference (या रिश्तेदार पूरक) की सरल सेट के संचालन से अधिक नहीं है: seq<T> कुछ खास नहीं बस IEnumerable<T> है।

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 (या यहां तक ​​HashSet बीसीएल में वर्ग) का उपयोग किया जा सकता है, लेकिन दृष्टिकोण यहां एफ # भाषा (की भावना में सबसे निश्चित रूप से सबसे अच्छा वाक्य रचना होने लगते हैं, और शायद सबसे कुशल भी)।

+1

इस बारे में सोचना कुछ है कि एक सूची को एक सेट में परिवर्तित करके, केवल विशिष्ट मान संरक्षित होते हैं (एक सेट की परिभाषा)। मेहरदाद द्वारा दिए गए उत्तर (लिंक-एन्यूमेरेबल विधियों का उपयोग करके) सभी मूल्यों को भी अलग रखेंगे। कभी-कभी यह कोई समस्या नहीं है लेकिन मैं बस इसे इंगित करना चाहता था। – polkduran

+1

(Set.of_list ए) - (Set.of_list बी) कम्यूटेटिव नहीं है – Indy9000

4

नहीं बहुत एफ # -y तरह से मैं के बारे में पता। आप हमेशा .NET पुस्तकालयों का सहारा ले सकते हैं।

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

सहमत हैं। एक और एफ # वाई रास्ता हो सकता है। बस संभावना का जिक्र किया। एक बेहतर उत्तर की प्रतीक्षा कर रहा है। –

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

डैनी