Compruebe si una lista y una matriz son iguales F #
Estoy tratando de comparar una lista y una matriz y ver si son iguales. Digamos que tenemos una lista list = [1;2;3;4]
y una matriz ar = [|1;2;3;4|]
. La función debe regresar true
si es igual y false
si no es igual. Lo hice así:
let list = [1;2;3;4]
let ar = [|1;2;3;4|]
let list' = Array.toList ar
(list = list')
Básicamente, lo que estoy haciendo es simplemente convertir y comparar dos listas. Mi pregunta es si hay alguna otra forma de hacer esto, quiero decir que no se limite a convertir entre lista y matriz y que no dependa completamente de las funciones de la biblioteca.
Respuestas
Puede usar el hecho de que tanto las listas como las matrices (así como la mayoría de las otras colecciones) implementan la seq<'a>
interfaz ( IEnumerable<T>
en términos de .NET) y, por lo tanto, puede pasarlas a las funciones del Seq
módulo sin ninguna conversión. Esto solo usa una interfaz, por lo que no hay gastos generales.
La función más fácil en la que puedo pensar para verificar si dos secuencias son iguales es forall2
, que toma dos secuencias y verifica que un predicado sea válido para los elementos por pares. En este caso, el predicado es solo una prueba de igualdad (fun a b -> a = b)
que puede resumir como (=)
:
let list = [1;2;3;4]
let ar = [|1;2;3;4|]
Seq.forall2 (=) list ar
Hay muchas formas de hacer esto. Aquí hay uno que compara los elementos por parejas:
if list.Length = ar.Length then
Seq.zip list ar
|> Seq.forall (fun (a, b) -> a = b)
else false
F # docs dicen:
Compara dos secuencias usando la función Seq.compareWith. La función compara elementos sucesivos a su vez y se detiene cuando encuentra el primer par desigual. Cualquier elemento adicional no contribuye a la comparación.
Que en tu caso se convierte en un delineador:
0 = Seq.compareWith (Comparer<_>.Default) list ar
No comprobé si se compila. Utilice Comparer.Default para comparar primitivas; de lo contrario, para tipos personalizados complejos, es posible que deba proporcionar los suyos propios.
Con Linq;
Enumerable.SequenceEqual (list, ar)
Basado en esto
let l = [1;2;3;4]
let a = [|1;2;3;4|]
let result = Seq.compareWith Operators.compare l a