Überprüfen Sie, ob eine Liste und ein Array gleich F # sind
Ich versuche, eine Liste und ein Array zu vergleichen und festzustellen, ob sie gleich sind. Nehmen wir an, wir haben eine Liste list = [1;2;3;4]
und ein Array ar = [|1;2;3;4|]
. Die Funktion sollte zurückgegeben werden, true
wenn sie gleich und false
wenn nicht gleich ist. Ich habe es so gemacht:
let list = [1;2;3;4]
let ar = [|1;2;3;4|]
let list' = Array.toList ar
(list = list')
Im Grunde genommen konvertiere und vergleiche ich einfach zwei Listen. Meine Frage ist, ob es einen anderen Weg gibt, dies zu tun. Ich meine, die nicht einfach zwischen Liste und Array konvertieren und sich nicht vollständig auf Bibliotheksfunktionen stützen.
Antworten
Sie können die Tatsache nutzen, dass sowohl Listen als auch Arrays (sowie die meisten anderen Sammlungen) die seq<'a>
Schnittstelle implementieren ( IEnumerable<T>
in den .NET-Begriffen), und sie einfach Seq
ohne Konvertierungen an die Funktionen des Moduls übergeben. Hierbei wird nur eine Schnittstelle verwendet, sodass kein Overhead entsteht.
Die einfachste Funktion, die ich mir vorstellen kann, um zu überprüfen, ob zwei Sequenzen gleich sind forall2
, ist die , die zwei Sequenzen verwendet und prüft, ob ein Prädikat für die Elemente paarweise gilt. In diesem Fall ist das Prädikat nur ein Gleichheitstest, (fun a b -> a = b)
den Sie abkürzen können als (=)
:
let list = [1;2;3;4]
let ar = [|1;2;3;4|]
Seq.forall2 (=) list ar
Es gibt viele Möglichkeiten, dies zu tun. Hier ist eine, die die Elemente paarweise vergleicht:
if list.Length = ar.Length then
Seq.zip list ar
|> Seq.forall (fun (a, b) -> a = b)
else false
F # -Dokumente sagen:
Sie vergleichen zwei Sequenzen mit der Funktion Seq.compareWith. Die Funktion vergleicht nacheinander aufeinanderfolgende Elemente und stoppt, wenn sie auf das erste ungleiche Paar trifft. Zusätzliche Elemente tragen nicht zum Vergleich bei.
Was in Ihrem Fall zum Oneliner wird:
0 = Seq.compareWith (Comparer<_>.Default) list ar
Ich habe nicht überprüft, ob es kompiliert wird. Verwenden Sie Comparer.Default , um Grundelemente zu vergleichen. Andernfalls müssen Sie für komplexe benutzerdefinierte Typen möglicherweise Ihre eigenen bereitstellen.
Mit Linq;
Enumerable.SequenceEqual (list, ar)
Basierend darauf
let l = [1;2;3;4]
let a = [|1;2;3;4|]
let result = Seq.compareWith Operators.compare l a