Controlla se un elenco e un array sono uguali F #

Jan 20 2021

Sto cercando di confrontare un elenco e un array e vedere se sono uguali. Diciamo di avere una lista list = [1;2;3;4]e un array ar = [|1;2;3;4|]. La funzione dovrebbe restituire truese uguale e falsese non uguale. L'ho fatto così:

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

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

Quindi, in pratica, quello che sto facendo è semplicemente convertire e confrontare due elenchi. La mia domanda è: esiste un altro modo per farlo, intendo che non si limita a convertire tra elenco e array e che non si basa interamente sulle funzioni di libreria.

Risposte

4 TomasPetricek Jan 20 2021 at 19:09

Puoi sfruttare il fatto che sia gli elenchi che gli array (così come la maggior parte delle altre raccolte) implementano l' seq<'a>interfaccia ( IEnumerable<T>nei termini .NET) e quindi puoi semplicemente passarli alle funzioni dal Seqmodulo senza alcuna conversione. Si tratta solo di utilizzare un'interfaccia, quindi non c'è sovraccarico.

La funzione più semplice a cui riesco a pensare per verificare se due sequenze sono uguali è forall2, che accetta due sequenze e controlla che un predicato valga per gli elementi a coppie. In questo caso, il predicato è solo un test di uguaglianza (fun a b -> a = b)che puoi abbreviare come (=):

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

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

Ci sono molti modi per farlo. Eccone uno che confronta gli elementi a coppie:

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

I documenti F # dicono:

Si confrontano due sequenze utilizzando la funzione Seq.compareWith. La funzione confronta gli elementi successivi a turno e si interrompe quando incontra la prima coppia disuguale. Eventuali elementi aggiuntivi non contribuiscono al confronto.

Che nel tuo caso diventa oneliner:

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

Non ho controllato se si compila. Utilizzare Comparer.Default per confrontare le primitive, altrimenti, per i tipi personalizzati complessi, potrebbe essere necessario fornire le proprie.

2 sardok Jan 20 2021 at 19:12

Con Linq;

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

Sulla base di questo

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