ตรวจสอบว่ารายการและอาร์เรย์เท่ากับ 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

เอกสาร F #พูดว่า:

คุณเปรียบเทียบสองลำดับโดยใช้ฟังก์ชัน Seq.compareWith ฟังก์ชันจะเปรียบเทียบองค์ประกอบที่ต่อเนื่องกันและหยุดเมื่อพบคู่แรกที่ไม่เท่ากัน องค์ประกอบเพิ่มเติมใด ๆ ไม่ได้มีส่วนช่วยในการเปรียบเทียบ

ซึ่งในกรณีของคุณจะกลายเป็น oneliner:

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

ไม่ได้ตรวจสอบว่าคอมไพล์ ใช้ค่าเริ่มต้นของComparer.Defaultเพื่อเปรียบเทียบแบบดั้งเดิมมิฉะนั้นสำหรับประเภทกำหนดเองที่ซับซ้อนคุณอาจต้องระบุของคุณเอง

2 sardok Jan 20 2021 at 19:12

ด้วย Linq;

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