2017-01-26 14 views
6

Có tồn tại (nếu không có trong thư viện chuẩn, sau đó có thể là gói Nuget) một lớp, thích hợp để sử dụng từ C#, cung cấp từ điển thuần túy chức năng? Nghĩa là, khi thêm hoặc xóa khóa, sẽ trả về một từ điển mới trong khi vẫn giữ nguyên từ gốc?C# hoàn toàn là từ điển chức năng

+6

Eh, 'ImmutableDictionary '? https://msdn.microsoft.com/en-us/library/dn467181(v=vs.111).aspx Khi bạn thao tác một từ điển bất biến, một bản sao của từ điển gốc được tạo, các thao tác được áp dụng và một từ điển bất biến mới được trả về . –

+3

Bạn đang lạm dụng từ 'chức năng'. Bạn đang hỏi về một từ điển chỉ đọc hoặc không thay đổi được. Có những lớp cung cấp cả hai hành vi –

Trả lời

8

Bạn đang tìm kiếm bất biến bộ sưu tập, ImmutableDictionary<TKey, TValue> trong trường hợp của bạn:

https://msdn.microsoft.com/en-us/library/dn467181(v=vs.111).aspx

Khi bạn thao tác một cuốn từ điển bất biến một bản sao của bản gốc điển được thực hiện, các thao tác được áp dụng và mới bất biến từ điển được trả lại.

+2

Trong trường hợp ai đó thắc mắc về sự khác biệt giữa các bộ sưu tập chỉ đọc như [ReadOnlyDictionary'] (https://msdn.microsoft.com/en-us/library/gg712875 (v = vs. 110) .aspx) và các bộ sưu tập bất biến như ['ImmutableDictionary'] (https://msdn.microsoft.com/en-us/library/dn467063 (v = vs.111) .aspx): trước đây không cung cấp các phương thức để sửa đổi bộ sưu tập, nhưng nó chỉ là một trình bao bọc xung quanh bộ sưu tập gốc, có thể sửa đổi, nếu nó được thay đổi thì bộ sưu tập chỉ đọc được sửa đổi. Các bộ sưu tập bất biến không phải là trình bao bọc, chúng không thể thay đổi được. –

+2

... nhưng chúng cung cấp các phương pháp để "sửa đổi" chúng như ['Add'] (https://msdn.microsoft.com/en-us/library/dn466983 (v = vs.111) .aspx) hoạt động tương tự đối với các phương thức 'string', chúng trả về một bộ sưu tập không thay đổi được sửa đổi mới, nhưng tập hợp cũ vẫn không thay đổi. –

3

Câu hỏi phải được lặp lại là ".NET có bất kỳ từ điển chỉ đọc hoặc không thay đổi nào" không? Câu trả lời là có cho cả hai.

Chức năng từ điển chỉ đọc được cung cấp bởi lớp ReadOnlyDictionary.

Tính bất biến có nghĩa là một cái gì đó khác - điều đó có nghĩa là chế độ xem của một khách hàng về bộ sưu tập không thay đổi ngay cả khi một người khác đang thực hiện thay đổi cho bộ sưu tập đó. Này được cung cấp bởi lớp ImmutableDictionary

1

Từ điển chức năng tốt nhất (hoặc 'bản đồ' khi họ đang nổi tiếng trong thế giới hoạt động) có sẵn như là một phần của thư viện này C# chức năng:

https://github.com/louthy/language-ext

đây là mô-đun đồ:

https://github.com/louthy/language-ext/blob/master/LanguageExt.Core/Map.cs

Disclaimer: tôi đã viết nó. Nhưng những lý do cho thư viện là để tạo điều kiện lập trình chức năng trong C#. Trong khi câu trả lời được chấp nhận của ImmutableDictionary là một giao diện kiểu OO hơn (ngay cả khi nó sử dụng ngữ nghĩa bất biến).

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