ตรวจสอบว่ารายการและอาร์เรย์เท่ากับ 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
เอกสาร F #พูดว่า:
คุณเปรียบเทียบสองลำดับโดยใช้ฟังก์ชัน Seq.compareWith ฟังก์ชันจะเปรียบเทียบองค์ประกอบที่ต่อเนื่องกันและหยุดเมื่อพบคู่แรกที่ไม่เท่ากัน องค์ประกอบเพิ่มเติมใด ๆ ไม่ได้มีส่วนช่วยในการเปรียบเทียบ
ซึ่งในกรณีของคุณจะกลายเป็น oneliner:
0 = Seq.compareWith (Comparer<_>.Default) list ar
ไม่ได้ตรวจสอบว่าคอมไพล์ ใช้ค่าเริ่มต้นของComparer.Defaultเพื่อเปรียบเทียบแบบดั้งเดิมมิฉะนั้นสำหรับประเภทกำหนดเองที่ซับซ้อนคุณอาจต้องระบุของคุณเอง
ด้วย Linq;
Enumerable.SequenceEqual (list, ar)
ขึ้นอยู่กับสิ่งนี้
let l = [1;2;3;4]
let a = [|1;2;3;4|]
let result = Seq.compareWith Operators.compare l a