जांचें कि क्या कोई सूची और सरणी समान F # हैं
मैं एक सूची और एक सरणी की तुलना करने की कोशिश कर रहा हूं और देखें कि क्या वे समान हैं। हम कहते हैं कि हमारे पास एक सूची list = [1;2;3;4]
और एक सरणी है ar = [|1;2;3;4|]
। true
यदि समान और false
नहीं तो फ़ंक्शन को वापस लौटना चाहिए । मैंने इसे इस तरह किया:
let list = [1;2;3;4]
let ar = [|1;2;3;4|]
let list' = Array.toList ar
(list = list')
इसलिए मूल रूप से मैं जो कर रहा हूं, वह केवल दो सूचियों को रूपांतरित करने और तुलना करने का है .. मेरा सवाल यह है कि ऐसा करने का कोई अन्य तरीका है, मेरा मतलब है कि जो केवल सूची और सरणी के बीच कनवर्ट नहीं करते हैं और जो पूरी तरह से पुस्तकालय के कार्यों पर भरोसा नहीं करते हैं।
जवाब
आप इस तथ्य का उपयोग कर सकते हैं कि सूची और सरणियाँ (साथ ही अधिकांश अन्य संग्रह) seq<'a>
इंटरफ़ेस को लागू करते हैं ( IEnumerable<T>
.NET शर्तों में) और इसलिए आप उन्हें Seq
बिना किसी रूपांतरण के केवल मॉड्यूल से फ़ंक्शन में पास कर सकते हैं । यह सिर्फ एक इंटरफ़ेस का उपयोग कर रहा है, इसलिए कोई ओवरहेड नहीं है।
सबसे आसान फ़ंक्शन मैं यह जांचने के लिए सोच सकता हूं कि क्या दो अनुक्रम समान हैं forall2
, जो दो अनुक्रम लेता है और जांचता है कि तत्वों के लिए एक विधेय पकड़ है। इस मामले में, विधेय सिर्फ समानता परीक्षण है (fun a b -> a = b)
जिसे आप निम्न के रूप में समझ सकते हैं (=)
:
let list = [1;2;3;4]
let ar = [|1;2;3;4|]
Seq.forall2 (=) list ar
ऐसे कई तरीके हैं जिनसे आप ऐसा कर सकते हैं। यहाँ एक है जो तत्वों को जोड़ो की तुलना करता है:
if list.Length = ar.Length then
Seq.zip list ar
|> Seq.forall (fun (a, b) -> a = b)
else false
एफ # डॉक्स कहते हैं:
आप Seq.compareWith फ़ंक्शन का उपयोग करके दो अनुक्रमों की तुलना करते हैं। फ़ंक्शन बदले में क्रमिक तत्वों की तुलना करता है, और जब यह पहली असमान जोड़ी का सामना करता है तो रुक जाता है। कोई भी अतिरिक्त तत्व तुलना में योगदान नहीं करते हैं।
जो आपके मामले में ऑनलाइन हो जाता है:
0 = Seq.compareWith (Comparer<_>.Default) list ar
यह संकलित करता है कि क्या नहीं है। प्राइमर की तुलना करने के लिए कम्पेरिजन का उपयोग करें। अन्यथा, जटिल कस्टम प्रकारों के लिए आपको अपना स्वयं का प्रदान करना पड़ सकता है।
लिनक के साथ;
Enumerable.SequenceEqual (list, ar)
के आधार पर इस
let l = [1;2;3;4]
let a = [|1;2;3;4|]
let result = Seq.compareWith Operators.compare l a