Tôi có một lớp học (SomeClass
) có chứa thuộc tính Name
trong số string
loại. Và tôi cần phải lưu trữ một mảng của lớp đó và tìm các mục của nó theo tên của chúng. Với mục đích này, có hai loại bộ sưu tập: KeyedCollection
và Dictionary
. Câu hỏi của tôi là: Sự khác biệt giữa chúng và trong trường hợp như thế nào tốt hơn là sử dụng KeyedCollection
và Dictionary
? Cảm ơn bạn đã giúp đỡ trong việc giải thích.Từ điển hoặc KeyedCollection?
Trả lời
Bạn không thể sử dụng KeyedCollection vì nó trừu tượng: http://msdn.microsoft.com/en-us/library/ms132438.aspx. Điều này có nghĩa là bạn không thể tạo ra một đối tượng của nó.
Nó được thiết kế đặc biệt cho kế thừa, do đó, so sánh OP được hỏi là giữa việc sử dụng một từ điển và một cái gì đó bạn kế thừa từ KeyedCollection. – mattmc3
Dưới đây là lời giải thích tốt về sự khác nhau giữa từ điển và KeyedCollection: http://geekswithblogs.net/NewThingsILearned/archive/2010/01/07/using-keyedcollectionlttkey-titemgt.aspx
điểm chính là:
- KeyedCollection là trừu tượng, vì vậy bạn không thể sử dụng nó trực tiếp.
- KeyedCollection hữu ích cho các trường hợp, khi khóa nằm trong chính tổ chức, khi đó bạn có thể đóng gói việc thu hồi khóa trong khi triển khai bộ sưu tập.
- Có những triển khai chung cho KeyedCollection (không nằm trong khung mặc định), cho phép bạn dán đại biểu truy xuất khóa vào bộ tạo bộ sưu tập, vì vậy bạn không phải lặp lại nó mỗi khi bạn thêm mục.
Theo mặc định, KeyedCollection sẽ tạo một từ điển bên dưới trang bìa.
Nếu Khóa cũng có ý nghĩa như là một phần của Giá trị và cũng xác định tính duy nhất thì đó là mục đích của một KeyedCollection.
Nếu bạn muốn thay đổi sự ủng hộ từ điển sau đó sử dụng ctor này:
protected KeyedCollection(
IEqualityComparer<TKey> comparer,
int dictionaryCreationThreshold)
Không ai trong số các ý kiến trước giải quyết sự khác biệt quan trọng nhất giữa hai: KeyedCollection giữ các mục của bạn theo thứ tự mà họ được thêm vào (mục đầu tiên được thêm vào là chỉ mục 0 và mục được thêm vào cuối cùng là ở chỉ mục cuối cùng). Từ điển không (hoặc ít nhất nó không bao giờ được bảo đảm để làm như vậy).
Lợi ích bổ sung này của KeyedCollection có chi phí hiệu suất nhỏ. Theo trang bìa, bạn phải trả chi phí duy trì cả từ điển và danh sách.
Nên được đánh dấu là câu trả lời. – Ted
Cụ thể là có vẻ như phương thức Remove() khá kém hiệu quả - nó tìm kiếm danh sách theo tuần tự để tìm mục nhập cần xóa và sau đó thay đổi các mục còn lại ở một vị trí bên trái. (Ngoài việc xóa mục nhập từ điển.) – RenniePet
"KeyedCollection có chi phí hiệu suất nhỏ", nhưng có lẽ điều này phụ thuộc vào cách bạn sử dụng nó. Nó cũng có thể hoạt động tốt hơn một chút so với từ điển ví dụ [khi được sử dụng quá mức với vòng lặp foreach] (http://stackoverflow.com/a/15904926/340045) phải không? – Ben
KeyedCollection cho phép các khóa có thể thay đổi và cách quản lý thay đổi trong khóa. Từ điển không cho phép thay đổi khóa. Thứ hai, nếu bạn có một bộ sưu tập cần tra cứu, logic để trích xuất khóa từ thực thể vẫn ở một nơi - trong khi duy trì từ điển sẽ cần phải đặt logic khai thác khóa ở mỗi vị trí nơi các mục được thêm/xóa khỏi từ điển.
A KeyedCollection
nên được sử dụng khi khóa nằm trên chính mục đó.
Theo mặc định, KeyedCollection
là một wrapper Collection<TItem>
xung quanh từ điển. Khi bạn sử dụng các bộ sưu tập nhỏ và/hoặc bạn muốn truy xuất các mục trực tiếp, số KeyedCollection
provides a constructor có thông số dictionaryCreationThreshold
, cho biết số bộ sưu tập nào cần chuyển sang Dictionary
.
Một khía cạnh khác trong số KeyedCollection
là bạn có thể chọn chuyển thuộc tính khóa (miễn là loại của chúng phù hợp). Điều này có thể tốt cho các mục có khóa kép, v.v. Hiệu suất, tôi không nghĩ việc gói một từ điển có nhiều chi phí ngoại trừ nếu bạn tạo ra một loạt các trường hợp KeyedCollection
hoặc nếu bạn sử dụng các bộ sưu tập thực sự lớn (có một số kiểm tra nội bộ null
để xác định xem có từ điển nào không).
Một điều tôi hy vọng sẽ thấy trong KeyedCollection
là un abstract
ing nó, nhưng bạn có thể làm cho một loại bê tông chung chỉ là dễ dàng.
- 1. Lớp từ điển PHP? hoặc thay thế?
- 2. Zip hai HashMaps (hoặc từ điển)
- 3. Từ điển, Danh sách hoặc Mảng?
- 4. Hunspell - Không thể mở tệp từ hoặc tệp từ điển cho từ điển có tên en_US
- 5. Nối từ điển vào từ điển?
- 6. Có triển khai cụ thể chung về KeyedCollection không?
- 7. Thêm vào từ điển trong từ điển
- 8. Từ điển python của từ điển
- 9. Từ điển từ điển của IQueryable
- 10. Python - tạo từ điển từ danh sách các từ điển
- 11. Từ ASP cổ điển tới .net C# hoặc vb?
- 12. ConcurrentDictionary - từ điển bị hỏng hoặc mã không hợp lệ?
- 13. chèn hoặc cập nhật các khóa trong từ điển python
- 14. phiên bản viết tắt của ExpandoObject hoặc từ điển?
- 15. Trong Javascript một từ điển hiểu, hoặc một Object `map`
- 16. Có thể sao chép tham chiếu đến đối tượng từ điển nhanh hơn hoặc truy cập trực tiếp từ điển từ điển không?
- 17. Phát âm từ điển
- 18. Đọc danh sách Python cho từ điển trong từ điển?
- 19. Kết hợp nhiều từ điển vào một từ điển đơn
- 20. Truy vấn Pymongo với từ điển bên trong từ điển?
- 21. Từ điển hai chiều?
- 22. Từ điển ghép nối
- 23. Từ điển lồng nhau
- 24. Từ điển Danh sách
- 25. Đọc XML từ điển
- 26. Từ điển và Lambdas vui
- 27. C# Từ điển của mảng
- 28. TypeScript, Lặp qua từ điển
- 29. const Từ điển trong C#
- 30. C# từ điển giao nhau
Lợi thế một (hơi mơ hồ?) Của KeyedCollection, ít nhất là nếu bạn có quyền kiểm soát quá trình tuần tự hóa, bạn chỉ phải tuần tự hóa phần Danh sách <> và gửi nó lên dây ". Không cần phải tuần tự hóa hoặc gửi phần Từ điển <> vì có thể được xây dựng lại ở đầu nhận như là một phần của quá trình deserializing của phần List <>. – RenniePet