2015-03-16 16 views
12

Tôi mới làm quen với lập trình .NET. Xin lỗi nếu câu hỏi này đã được hỏi trước.F #: Sự khác biệt giữa Từ điển, Hashtable và Bản đồ

Tôi hiện đang học F #. Sự khác biệt giữa Từ điển, Hashtable và Bản đồ là gì? Tôi nên sử dụng mỗi khi nào?

Tôi cũng có một câu hỏi khác không được đề cập trong tiêu đề. Khi nào tôi nên sử dụng Async.RunSynchronously? Nó có vẻ khá tự mâu thuẫn với tôi, vì vậy tôi chắc chắn rằng tôi đang thiếu một cái gì đó.

Trả lời

18

Lựa chọn giữa Từ điển, Hashtable và Bản đồ tùy thuộc vào trường hợp sử dụng. Tuy nhiên, bạn nên biết các đặc tính của từng loại. Đây không phải là một danh sách đầy đủ nhưng chỉ là một số khác biệt quan trọng bạn có thể muốn bắt đầu từ:

  • Hashtable Đại diện cho một tập hợp các cặp khóa/giá trị được tổ chức dựa trên mã băm của khoá. Đây là bộ sưu tập có thể thay đổi từ .NET BCL
  • từ điển <> đây là triển khai chung của thẻ bắt đầu bằng #. Ngoài ra, bộ sưu tập có thể thay đổi từ .NET BCL
  • Bản đồ Đây là loại không thay đổi F #. Nó được thực hiện dựa trên các cây AVL mà là một cấu trúc dữ liệu hoàn toàn khác với các đặc tính hiệu suất và các trường hợp sử dụng khác nhau.

Nếu bạn đang thực hiện nhiều lần ghi, bộ sưu tập Bảng băm có hiệu suất tỷ lệ lấp đầy tốt hơn đáng kể so với cây AVL.

Lấy giá trị từ một từ điển bằng cách sử dụng khóa của nó rất nhanh, gần O (1), vì lớp Từ điển được triển khai dưới dạng bảng băm.

Bản đồ F # được triển khai dưới dạng cây AVL không thay đổi, cấu trúc dữ liệu hiệu quả tạo thành cây nhị phân tự cân bằng. Cây AVL nổi tiếng về hiệu quả của chúng, trong đó chúng có thể tìm kiếm, chèn và xóa các phần tử trong cây trong thời gian O (log n), trong đó n là số phần tử trong cây.

Đối với trường hợp sử dụng bản đồ, nếu bạn có một bộ dữ liệu tĩnh (chẳng hạn như dữ liệu cấu hình được tải khi ứng dụng của bạn khởi động), bạn cần tra cứu thường xuyên bằng phím, Bản đồ là lựa chọn tốt như bất kỳ, tính bất biến của nó trong trường hợp này đảm bảo rằng dữ liệu tĩnh không thể được sửa đổi do nhầm lẫn và có ít tác động đến hiệu suất vì bạn không bao giờ cần phải thay đổi nó khi được khởi tạo.

Async.RunSynchronously chạy tính toán không đồng bộ được cung cấp và đang chờ kết quả của nó. Bạn có thể sử dụng nó trong cửa sổ tương tác F # ví dụ để kiểm tra quy trình công việc không đồng bộ của bạn.

+2

Như Thomas đã chỉ ra việc chọn vùng chứa liên kết phù hợp phụ thuộc vào trường hợp sử dụng nhưng vì Bản đồ không thay đổi, người ta có thể cho rằng chúng phù hợp hơn với kiểu chức năng. – FuleSnabel

Các vấn đề liên quan