Sprawdź, czy lista i tablica są równe F #
Próbuję porównać listę i tablicę i sprawdzić, czy są równe. Powiedzmy, że mamy listę list = [1;2;3;4]
i tablicę ar = [|1;2;3;4|]
. Funkcja powinna zwrócić, true
jeśli jest równa i false
jeśli nie jest równa. Zrobiłem to tak:
let list = [1;2;3;4]
let ar = [|1;2;3;4|]
let list' = Array.toList ar
(list = list')
Więc zasadniczo to, co robię, to po prostu konwertowanie i porównywanie dwóch list. Moje pytanie brzmi, czy istnieje inny sposób, aby to zrobić, mam na myśli, który nie polega po prostu na konwersji między listą a tablicą i który nie polega całkowicie na funkcjach bibliotecznych.
Odpowiedzi
Można wykorzystać fakt, że zarówno listy, jak i tablice (a także większość innych kolekcji) implementują seq<'a>
interfejs ( IEnumerable<T>
w kategoriach .NET) i można je po prostu przekazać do funkcji z Seq
modułu bez żadnych konwersji. To tylko użycie interfejsu, więc nie ma narzutów.
Najłatwiejszą funkcją, jaką przychodzi mi do głowy, do sprawdzania, czy dwie sekwencje są takie same, jest forall2
pobieranie dwóch sekwencji i sprawdzanie, czy predykat zachowuje pary elementów. W tym przypadku predykat jest po prostu testem równości, (fun a b -> a = b)
który można skrócić jako (=)
:
let list = [1;2;3;4]
let ar = [|1;2;3;4|]
Seq.forall2 (=) list ar
Można to zrobić na wiele sposobów. Oto przykład, który porównuje elementy parami:
if list.Length = ar.Length then
Seq.zip list ar
|> Seq.forall (fun (a, b) -> a = b)
else false
Dokumenty F # mówią:
Porównujesz dwie sekwencje za pomocą funkcji Seq.compareWith. Funkcja porównuje kolejno kolejne elementy i zatrzymuje się, gdy napotka pierwszą nierówną parę. Żadne dodatkowe elementy nie mają wpływu na porównanie.
Który w Twoim przypadku staje się onelinerem:
0 = Seq.compareWith (Comparer<_>.Default) list ar
Nie sprawdziłem, czy się kompiluje. Użyj Comparer.Default, aby porównać prymitywy, w przeciwnym razie w przypadku złożonych typów niestandardowych może być konieczne podanie własnych.
Z Linq;
Enumerable.SequenceEqual (list, ar)
Na tej podstawie
let l = [1;2;3;4]
let a = [|1;2;3;4|]
let result = Seq.compareWith Operators.compare l a