18

Có một số chủ đề trên Stack Overflow đối phó với việc thực hiện priority queues in .Net and C#.Tại sao khung .Net không có lớp xếp hàng ưu tiên?

Vấn đề của tôi có bản chất cơ bản hơn: Tại sao không có hàng đợi ưu tiên trong hộp trong khuôn khổ .Net? Ngay cả Thư viện chuẩn C++ cũng có.

+1

Một trong những điều đầu tiên tôi nhận thấy khi di chuyển từ Java sang C#. Không có hàng đợi ưu tiên? Java thậm chí đã có/có hàng đợi ưu tiên đồng bộ. – Carra

+0

xem thêm http://stackoverflow.com/questions/102398/priority-queue-in-net –

Trả lời

12

Có một câu hỏi trước đây (why C# does allow non-member functions like C++) đã nhắc Eric Lippert viết một số blog post về lý do tại sao. Trong đó, anh giải thích:

Tôi được hỏi "tại sao C# không triển khai tính năng X?" mọi lúc. Câu trả lời luôn giống nhau: bởi vì không ai từng được thiết kế, chỉ định, triển khai, thử nghiệm, ghi chép và vận chuyển tính năng đó. Tất cả sáu trong số những điều đó là cần thiết để làm cho một tính năng xảy ra. Tất cả đều tốn rất nhiều thời gian, công sức và tiền bạc. Các tính năng không hề rẻ và chúng tôi cố gắng hết sức để đảm bảo rằng chúng tôi chỉ vận chuyển những tính năng mang lại những lợi ích tốt nhất có thể cho người dùng của chúng tôi vì thời gian, nỗ lực và ngân sách hạn chế của chúng tôi.

tôi nghi ngờ đó có lẽ là câu trả lời cho lý do tại sao Net không tàu với một hàng đợi ưu tiên - chỉ có không đủ thời gian, công sức, tiền bạc, nhu cầu để thực hiện một (?).

+2

Cảm ơn, Adrian, tôi đã đọc bài đăng trên blog đó khi anh ấy viết nó. Tôi cũng quan tâm để nghe ý kiến ​​của những người không phải MS - đó có phải là cấu trúc dữ liệu không thực sự cần thiết trong một khuôn khổ không? là nó tầm thường đủ để bỏ ra cho tất cả các nhà phát triển khác để thực hiện một mình? vv Tôi biết quan điểm của tôi, nhưng tôi có thể điều chỉnh trên cơ sở đầu vào của người khác. :-) –

+3

Thời gian là một câu hỏi về các ưu tiên. Nếu họ nói rằng không có đủ thời gian, thì câu hỏi sẽ trở thành: "Tại sao * không * bao gồm hàng đợi ưu tiên, nhưng * do * bao gồm xxx?" Và xxx có thể là thứ ít được sử dụng hơn hàng đợi ưu tiên. Tôi không biết, có thể lấy xxx = HybridDictionary. Tôi chắc rằng họ đã có thứ gì đó có thể bị bỏ quên để dành thời gian cho hàng đợi ưu tiên. –

+0

Vâng, đó là chính xác những gì tôi có nghĩa là, nhưng bạn xây dựng nó tốt hơn ... ;-) –

4

.NET 4.0 giới thiệu lớp SortedSet<T>, cùng với giao diện ISet<T> được triển khai bởi SortedSet<T>HashSet<T>. Điều này rõ ràng sẽ làm cho việc triển khai lớp PriorityQueue<T> của bạn trở nên đơn giản hơn.

Tuy nhiên, vẫn không có giao diện IQueue<T>, ít nhất sẽ thừa nhận nhu cầu xếp hàng ưu tiên hoặc bất kỳ việc triển khai nào khác so với BCL Queue<T> cơ bản. Tương tự, không có IStack<T>.

Cá nhân tôi thấy thiếu một số giao diện cơ bản nhất này đáng thất vọng và thiếu tầm nhìn, đặc biệt là chi phí thiết kế/đặc tả/triển khai/thử nghiệm/tài liệu để trích xuất một giao diện đơn giản từ một lớp hiện có sẽ rất thấp.

public interface IQueue<T> : IEnumerable<T>, ICollection, IEnumerable 
{ 
    T Dequeue(); 
    void Enqueue(T item); 
    T Peek(); 
} 

Có, thấy không? Tôi đã làm xong.

+1

Bạn đã mã hóa giao diện nhưng lớp học thì sao? Không có nhiều giao diện trong. Net không đi kèm với ít nhất một triển khai. – cjk

+6

Giao diện đó có thể sử dụng được bởi hàng đợi không thể đếm được, như hàng đợi truyền thông không đồng bộ không? Điều gì về điểm cuối hàng đợi, nên họ có giao diện riêng của họ, để bạn chỉ có thể cung cấp khả năng push cho một phần của mã và khả năng kéo đến một phần khác? Vấn đề không phải là viết những dòng 5 mã, vấn đề là thiết kế nó để không ai phàn nàn, và nó tạo ra giá trị cho thời gian chạy .NET trong tiến trình. –

+2

ck: xem System.Collections.Generic.Queue Lasse: bộ sưu tập không đồng bộ/đồng thời không có cùng một hợp đồng hành vi, vì vậy chúng sẽ không cần triển khai giao diện. Quan điểm của tôi là thái độ đội ngũ BCL dường như là nếu họ chỉ cung cấp một triển khai xây dựng, không cần giao diện, đó không phải là thái độ chính xác. IMHO. –

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