Bir liste ve dizinin eşit olup olmadığını kontrol edin F #

Jan 20 2021

Bir liste ile bir diziyi karşılaştırmaya ve eşit olup olmadıklarına bakmaya çalışıyorum. Diyelim ki bir listemiz list = [1;2;3;4]ve bir dizimiz var ar = [|1;2;3;4|]. İşlev trueeşitse ve eşit falsedeğilse geri dönmelidir . Ben böyle yaptım:

let list = [1;2;3;4]
let ar = [|1;2;3;4|]

let list' = Array.toList ar
(list = list')

Yani temelde yaptığım şey basitçe iki listeyi dönüştürmek ve karşılaştırmak. Sorum şu ki, bunu yapmanın başka bir yolu var, yani sadece liste ve dizi arasında dönüştürme yapmayan ve tamamen kitaplık işlevlerine dayanmayan.

Yanıtlar

4 TomasPetricek Jan 20 2021 at 19:09

Hem listelerin hem de dizilerin (ve diğer koleksiyonların çoğunun) seq<'a>arabirimi ( IEnumerable<T>.NET terimleriyle) uyguladığı gerçeğini kullanabilirsiniz ve böylece bunları Seqherhangi bir dönüştürme yapmadan modülden işlevlere geçirebilirsiniz . Bu sadece bir arayüz kullanıyor, bu yüzden ek yük yok.

İki dizinin aynı olup olmadığını kontrol etmek için düşünebildiğim en kolay işlev forall2, iki dizi alır ve bir yüklemin öğeler için çiftli olup olmadığını kontrol eder. Bu durumda, yüklem, (fun a b -> a = b)şu şekilde kısaltabileceğiniz eşitlik testidir (=):

let list = [1;2;3;4]
let ar = [|1;2;3;4|]

Seq.forall2 (=) list ar
2 brianberns Jan 20 2021 at 10:37

Bunu yapmanın birçok yolu var. Öğeleri ikili olarak karşılaştıran bir örnek:

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 # dokümanlar şunu söylüyor:

Seq.compareWith işlevini kullanarak iki sıralamayı karşılaştırırsınız. İşlev, ardışık öğeleri sırayla karşılaştırır ve ilk eşit olmayan çiftle karşılaştığında durur. Herhangi bir ek unsur, karşılaştırmaya katkıda bulunmaz.

Sizin durumunuzda hangisi oneliner olur:

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

Derlenip derlenmediğini kontrol etmedim. İlkelleri karşılaştırmak için Comparer.Default'u kullanın , aksi takdirde, kendi başınıza sağlamanız gerekebilecek karmaşık özel türler için.

2 sardok Jan 20 2021 at 19:12

Linq ile;

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

Dayanarak bu

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