如何解决检查列表和数组是否相等 F#
我正在尝试比较一个列表和一个数组,看看它们是否相等。假设我们有一个列表 list = [1;2;3;4]
和一个数组 ar = [|1;2;3;4|]
。如果相等,函数应该返回 true
,如果不相等,则返回 false
。我是这样做的:
let list = [1;2;3;4]
let ar = [|1;2;3;4|]
let list' = Array.toList ar
(list = list')
所以基本上我正在做的只是转换和比较两个列表。 .
解决方法
您可以使用列表和数组(以及大多数其他集合)实现 seq<'a>
接口(.NET 术语中的 IEnumerable<T>
)这一事实,因此您可以将它们传递给Seq
模块中的函数,无需任何转换。这只是使用一个接口,所以没有开销。
我能想到的用于检查两个序列是否相同的最简单的函数是 forall2
,它接受两个序列并检查谓词对两个元素是否成立。在这种情况下,谓词只是相等测试 (fun a b -> a = b)
,您可以将其缩写为 (=)
:
let list = [1;2;3;4]
let ar = [|1;2;3;4|]
Seq.forall2 (=) list ar
,
有很多方法可以做到这一点。这是成对比较元素的一个:
if list.Length = ar.Length then
Seq.zip list ar
|> Seq.forall (fun (a,b) -> a = b)
else false
,
F# docs 说:
您可以使用 Seq.compareWith 函数比较两个序列。该函数依次比较连续的元素,并在遇到第一个不等对时停止。任何其他元素都不会参与比较。
在你的情况下成为单线:
0 = Seq.compareWith (Comparer<_>.Default) list ar
没有检查它是否编译。使用 Comparer.Default 比较原语,否则,对于复杂的自定义类型,您可能需要提供自己的类型。
,使用 Linq;
Enumerable.SequenceEqual (list,ar)
,
基于this
let l = [1;2;3;4]
let a = [|1;2;3;4|]
let result = Seq.compareWith Operators.compare l a
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。