Kiểm tra xem danh sách và mảng có bằng nhau F # không

Jan 20 2021

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ề truenếu bằng và falsenế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

4 TomasPetricek Jan 20 2021 at 19:09

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ừ Seqmô-đ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
2 brianberns Jan 20 2021 at 10:37

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
2 SerejaBogolubov Jan 20 2021 at 15:01

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.

2 sardok Jan 20 2021 at 19:12

Với Linq;

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

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