Tại sao không có triển khai chung của OrderedDipedia trong .net?


26

Tại sao Microsoft không cung cấp triển khai chung cho OrderedDipedia?

Có một vài triển khai tùy chỉnh mà tôi đã thấy, bao gồm: http://www.codeproject.com/KB/recipes/GenericOrderedDipedia.aspx

Nhưng tại sao Microsoft không đưa nó vào thư viện .net cơ sở? Chắc chắn họ có lý do để không xây dựng chung chung .... nhưng đó là gì?

Trước khi đăng thông báo này, tôi đã xem: https://stackoverflow.com/questions/2629027/no-generic-im THỰCation-of-orderdipedia

Nhưng điều đó chỉ xác nhận rằng nó không tồn tại. Không phải tại sao nó không tồn tại.

Cảm ơn


2
Luôn có SortedDictionary<TKey, TValue>: msdn.microsoft.com/en-us/l Library / f7fta44c.aspx
Travis Gockel

2
Trừ khi tôi hiểu sai các tài liệu SortedDict, đó không phải là điều tôi muốn. Tôi không muốn thực hiện bất kỳ phân loại. Tôi chỉ muốn một mảng mà tôi cũng có thể truy cập bằng khóa. Dù sao, tôi thực sự tự hỏi tại sao MS bỏ qua điều này. (Các vấn đề tinh tế, v.v.)
nonot1

Trường hợp sử dụng điển hình cho một từ điển được đặt hàng là gì? Tôi đang vật lộn để nghĩ về một cái trên đỉnh đầu của tôi.
Carson63000

1
@Carson bất cứ khi nào bạn có một mảng các mục dữ liệu mà bạn cũng cần truy cập ngẫu nhiên nhanh chóng. Để đơn giản lưu trữ trong Dict sẽ mất thông tin đặt hàng và sử dụng một mảng đòi hỏi bạn phải duy trì chỉ mục của riêng mình.
nonot1

2
Yêu cầu Eric Lippert đọc và trả lời câu hỏi của bạn. Anh ấy thường rất đồng ý giúp đỡ với loại câu hỏi này. Tôi nghĩ bạn có thể liên lạc với anh qua blog của mình: blogs.msdn.com/b/ericlippert
devuxer

Câu trả lời:


17

Trong C # 4.0 Trong một Nutshell tôi đọc điều này:

  1. An OrderedDictionarylà sự kết hợp của một HashTableArrayList
  2. Không có chung chung ArrayList
  3. " ArrayListLớp không chuyên được sử dụng chủ yếu để tương thích ngược với Khung 1.x ..."
  4. "An ArrayListlà chức năng tương tự như List<object>"
  5. "Phản xạ là dễ dàng hơn với một người ArrayListkhông chuyên hơn là List<object>"

Phần kết luận?

Không có chung chung OrderedDictionaryvì cấu trúc cơ bản của nó là một lớp không được khấu hao (không chính thức) mà không có phiên bản chung.


4
Điều này không thực sự trả lời câu hỏi. Một OrderedDipedia chung rõ ràng có thể được xây dựng trên Từ điển chung và Danh sách chung.
JacquesB

Một nguyên tắc sử dụng lớp là nếu UI không thay đổi ai quan tâm đến việc thực hiện? Vâng, nhóm thiết kế / biên dịch ngôn ngữ, giả sử, có thể thích cái chung kế thừa đối tác không chung chung của nó . Kính râm của tôi. Đối với người mới bắt đầu: Có phải tổ tiên khác nhau (ngay lập tức) là một mỏ đất ở đâu đó trong con đường tiến hóa cho OrderedDictionaryhiệp phương sai và phương sai?
radarbob

15

Quá OrderedDictionarytải hoạt động lập chỉ mục để lập chỉ mục với một số nguyên Nsẽ đưa mục vào vị trí N, trong khi lập chỉ mục với một Objectsẽ lấy mục đó lõi cho đối tượng đó. Nếu một người tạo ra một vật phẩm OrderedDictionary<int, string>được gọi myDictvà thêm (1, "George") và (0, "Fred") theo thứ tự đó, nên myDict[0]trả lại "George" hay "Fred"?

Một vấn đề như vậy có thể đã được giải quyết bằng cách áp đặt một ràng buộc lớp đối với loại khóa. Mặt khác, phần lớn tính hữu dụng của các bộ sưu tập chung bắt nguồn từ khả năng làm việc hiệu quả với các loại giá trị. Áp đặt một ràng buộc lớp đối với loại khóa có vẻ hơi xấu.

Nếu lớp không phải tuân thủ CLS mà chỉ phải làm việc với vb.net, một thiết kế hợp lý có thể đã được sử dụng các thuộc tính được lập chỉ mục có tên. Do đó, trong ví dụ trên, myDict.ByKey[0]sẽ mang lại "Fred", và myDict.BySequence[0]sẽ mang lại "George". Thật không may, các ngôn ngữ như C # không hỗ trợ các thuộc tính được lập chỉ mục. Mặc dù người ta có thể đã loại bỏ một cái gì đó để cho phép sử dụng cú pháp trên ngay cả khi không có các thuộc tính như vậy, nhưng quyết định không may là bọc các trường cấu trúc như PointRectanglecó nghĩa là myDict.ByKey[0] = "Wally"để làm việc, myDict.ByKeysẽ phải trả về một đối tượng lớp mới. Một cấu trúc sẽ hiệu quả hơn, nhưng các trình biên dịch sẽ từ chối những gì trông giống như ghi vào một cấu trúc chỉ đọc (mặc dù thuộc tính đó sẽ không sửa đổi cấu trúc được trả về bởiByKey, nhưng thay vào đó sửa đổi bộ sưu tập mà nó chứa một tham chiếu).

Cá nhân, tôi nghĩ rằng một đối tượng từ điển được chỉ định là theo dõi thứ tự chèn sẽ là một điều tốt đẹp để có; Tôi cũng muốn có một đối tượng từ điển có thể dễ dàng trả về khóa được liên kết với một khóa cụ thể (vì vậy, ví dụ: nếu một từ điển không phân biệt chữ hoa chữ thường và đã thêm một bản ghi với khóa "GEORGE", một có thể hỏi từ điển khóa nào được liên kết với "George" mà không phải tìm kiếm trong tất cả các KeyValuePairđối tượng được trả về trong bảng liệt kê.


3

Bởi vì việc duy trì trật tự sẽ ngăn chặn tra cứu O (1) mà IDadata ngụ ý trừ khi bạn gói hai bộ sưu tập (một cho đơn hàng, một cho tra cứu), điều này làm cho việc thêm / xóa ít hiệu suất hơn và tăng mức sử dụng bộ nhớ. Hoặc bạn có thể có tra cứu chậm hơn để sử dụng ít bộ nhớ hơn.

Tôi đoán là không có lựa chọn 'rõ ràng tốt hơn' ở đây, vì vậy nó đã không đi vào thư viện tiêu chuẩn. Đặc biệt là khoảng 2.0, C # vẫn đang học hỏi từ những sai lầm của Java. Tôi sẽ không ngạc nhiên nếu cách tiếp cận 'mọi thứ và bồn rửa nhà bếp' của Java đối với các bộ sưu tập trong thư viện tiêu chuẩn của họ cũng được xem là điều cần tránh.


1
Việc tìm kiếm chậm hơn để đổi lấy bộ nhớ ít hơn chỉ có hiệu quả làm cho OrderedDictionarya List. Tôi tưởng tượng rằng bất kỳ ai có trường hợp sử dụng hợp pháp cho một người OrderedDictionaryđang sử dụng cụ thể vì họ cần một lớp bộ sưu tập có tra cứu O (1) nhưng cũng nhớ thứ tự chèn, trong trường hợp đó sử dụng bộ nhớ bổ sung là không thể tránh khỏi và do đó có thể chấp nhận được.
Abion47
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.