2011-09-27 42 views
49

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: KeyedCollectionDictionary. 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 KeyedCollectionDictionary? Cảm ơn bạn đã giúp đỡ trong việc giải thích.Từ điển hoặc KeyedCollection?

+2

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

Trả lời

-11

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ó.

+11

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

14

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.
5

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) 
58

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.

+0

Nên được đánh dấu là câu trả lời. – Ted

+3

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

+0

"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

4

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.

0

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ố KeyedCollectionprovides 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.

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