Bir liste ve dizinin eşit olup olmadığını kontrol edin F #
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 true
eşitse ve eşit false
değ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
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ı Seq
herhangi 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
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
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.
Linq ile;
Enumerable.SequenceEqual (list, ar)
Dayanarak bu
let l = [1;2;3;4]
let a = [|1;2;3;4|]
let result = Seq.compareWith Operators.compare l a