Kiểm tra xem danh sách và mảng có bằng nhau F # không
Tôi đang cố gắng so sánh một danh sách và một mảng và xem liệu chúng có bằng nhau không. Giả sử chúng ta có một danh sách list = [1;2;3;4]
và một mảng ar = [|1;2;3;4|]
. Hàm sẽ trả về true
nếu bằng và false
nếu không bằng. Tôi đã làm nó như thế này:
let list = [1;2;3;4]
let ar = [|1;2;3;4|]
let list' = Array.toList ar
(list = list')
Vì vậy, về cơ bản những gì tôi đang làm chỉ đơn giản là chuyển đổi và so sánh hai danh sách .. Câu hỏi của tôi là có cách nào khác để làm điều này không, ý tôi là không chỉ chuyển đổi giữa danh sách và mảng và không dựa hoàn toàn vào các hàm thư viện.
Trả lời
Bạn có thể sử dụng thực tế là cả danh sách và mảng (cũng như hầu hết các bộ sưu tập khác) đều triển khai seq<'a>
giao diện ( IEnumerable<T>
theo thuật ngữ .NET) và vì vậy bạn chỉ có thể chuyển chúng đến các chức năng từ Seq
mô-đun mà không cần bất kỳ chuyển đổi nào. Đây chỉ là sử dụng một giao diện, vì vậy không có chi phí.
Chức năng dễ nhất mà tôi có thể nghĩ đến để kiểm tra xem hai chuỗi có giống nhau hay không forall2
, có hai chuỗi và kiểm tra xem một vị từ có giữ cho các phần tử theo cặp hay không. Trong trường hợp này, vị từ chỉ là phép thử bình đẳng (fun a b -> a = b)
mà bạn có thể hủy bỏ là (=)
:
let list = [1;2;3;4]
let ar = [|1;2;3;4|]
Seq.forall2 (=) list ar
Có rất nhiều cách bạn có thể làm điều này. Đây là một trong những so sánh các phần tử theo từng cặp:
if list.Length = ar.Length then
Seq.zip list ar
|> Seq.forall (fun (a, b) -> a = b)
else false
F # tài liệu nói:
Bạn so sánh hai chuỗi bằng cách sử dụng hàm Seq.compareWith. Hàm lần lượt so sánh các phần tử liên tiếp và dừng khi gặp cặp không bằng nhau đầu tiên. Bất kỳ yếu tố bổ sung nào không góp phần vào việc so sánh.
Mà trong trường hợp của bạn trở thành oneliner:
0 = Seq.compareWith (Comparer<_>.Default) list ar
Không kiểm tra xem nó có biên dịch không. Sử dụng Comparer.Default để so sánh các loại nguyên thủy, nếu không, đối với các loại tùy chỉnh phức tạp, bạn có thể cần cung cấp loại tùy chỉnh của riêng mình.
Với Linq;
Enumerable.SequenceEqual (list, ar)
Dựa trên cái này
let l = [1;2;3;4]
let a = [|1;2;3;4|]
let result = Seq.compareWith Operators.compare l a