Periksa apakah daftar dan array sama dengan F #
Saya mencoba membandingkan daftar dan array dan melihat apakah mereka sama. Katakanlah kita memiliki daftar list = [1;2;3;4]
dan array ar = [|1;2;3;4|]
. Fungsi tersebut harus dikembalikan true
jika sama dan false
jika tidak sama. Saya melakukannya seperti ini:
let list = [1;2;3;4]
let ar = [|1;2;3;4|]
let list' = Array.toList ar
(list = list')
Jadi pada dasarnya apa yang saya lakukan hanyalah mengkonversi dan membandingkan dua daftar .. Pertanyaan saya adalah apakah ada cara lain untuk melakukan ini, maksud saya yang tidak hanya mengkonversi antara daftar dan array dan yang tidak bergantung sepenuhnya pada fungsi perpustakaan.
Jawaban
Anda dapat menggunakan fakta bahwa daftar dan larik (serta sebagian besar koleksi lainnya) mengimplementasikan seq<'a>
antarmuka ( IEnumerable<T>
dalam istilah .NET) sehingga Anda dapat meneruskannya ke fungsi dari Seq
modul tanpa konversi apa pun. Ini hanya menggunakan antarmuka, jadi tidak ada biaya tambahan.
Fungsi termudah yang dapat saya pikirkan untuk memeriksa apakah dua urutan itu sama adalah forall2
, yang mengambil dua urutan dan memeriksa bahwa predikat berlaku untuk elemen secara berpasangan. Dalam hal ini, predikatnya hanyalah uji kesetaraan (fun a b -> a = b)
yang dapat disimpulkan sebagai (=)
:
let list = [1;2;3;4]
let ar = [|1;2;3;4|]
Seq.forall2 (=) list ar
Ada banyak cara untuk melakukan ini. Inilah salah satu yang membandingkan elemen secara berpasangan:
if list.Length = ar.Length then
Seq.zip list ar
|> Seq.forall (fun (a, b) -> a = b)
else false
F # dokumen mengatakan:
Anda membandingkan dua urutan dengan menggunakan fungsi Seq.compareWith. Fungsi tersebut membandingkan elemen yang berurutan secara bergantian, dan berhenti jika menemukan pasangan pertama yang tidak sama. Elemen tambahan apa pun tidak berkontribusi pada perbandingan.
Yang dalam kasus Anda menjadi satu perjalanan:
0 = Seq.compareWith (Comparer<_>.Default) list ar
Tidak memeriksa apakah itu dikompilasi. Gunakan Comparer.Default untuk membandingkan primitif, jika tidak, untuk jenis kustom yang rumit Anda mungkin perlu menyediakan milik Anda sendiri.
Dengan Linq;
Enumerable.SequenceEqual (list, ar)
Berdasarkan ini
let l = [1;2;3;4]
let a = [|1;2;3;4|]
let result = Seq.compareWith Operators.compare l a