जांचें कि क्या कोई सूची और सरणी समान F # हैं

Jan 20 2021

मैं एक सूची और एक सरणी की तुलना करने की कोशिश कर रहा हूं और देखें कि क्या वे समान हैं। हम कहते हैं कि हमारे पास एक सूची 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')

इसलिए मूल रूप से मैं जो कर रहा हूं, वह केवल दो सूचियों को रूपांतरित करने और तुलना करने का है .. मेरा सवाल यह है कि ऐसा करने का कोई अन्य तरीका है, मेरा मतलब है कि जो केवल सूची और सरणी के बीच कनवर्ट नहीं करते हैं और जो पूरी तरह से पुस्तकालय के कार्यों पर भरोसा नहीं करते हैं।

जवाब

4 TomasPetricek Jan 20 2021 at 19:09

आप इस तथ्य का उपयोग कर सकते हैं कि सूची और सरणियाँ (साथ ही अधिकांश अन्य संग्रह) 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
2 brianberns Jan 20 2021 at 10:37

ऐसे कई तरीके हैं जिनसे आप ऐसा कर सकते हैं। यहाँ एक है जो तत्वों को जोड़ो की तुलना करता है:

if list.Length = ar.Length then
    Seq.zip list ar
        |> Seq.forall (fun (a, b) -> a = b)
else false
2 SerejaBogolubov Jan 20 2021 at 15:01

एफ # डॉक्स कहते हैं:

आप Seq.compareWith फ़ंक्शन का उपयोग करके दो अनुक्रमों की तुलना करते हैं। फ़ंक्शन बदले में क्रमिक तत्वों की तुलना करता है, और जब यह पहली असमान जोड़ी का सामना करता है तो रुक जाता है। कोई भी अतिरिक्त तत्व तुलना में योगदान नहीं करते हैं।

जो आपके मामले में ऑनलाइन हो जाता है:

0 = Seq.compareWith (Comparer<_>.Default) list ar

यह संकलित करता है कि क्या नहीं है। प्राइमर की तुलना करने के लिए कम्पेरिजन का उपयोग करें। अन्यथा, जटिल कस्टम प्रकारों के लिए आपको अपना स्वयं का प्रदान करना पड़ सकता है।

2 sardok Jan 20 2021 at 19:12

लिनक के साथ;

Enumerable.SequenceEqual (list, ar)
2 ThanasisK Jan 20 2021 at 19:24

के आधार पर इस

let l = [1;2;3;4]
let a = [|1;2;3;4|]
let result = Seq.compareWith Operators.compare l a