为什么.Net框架没有优先级队列类?

时间:2009-12-14 09:33:16

标签: .net data-structures priority-queue standard-library library-design

Stack Overflow上有一些线程涉及实现priority queues in .Net and C#

我的问题是一个更基本的问题:为什么.Net框架中没有开箱即用的优先级队列?即使是C ++标准库也有一个。

5 个答案:

答案 0 :(得分:12)

前一段时间有一个问题(why C# does allow non-member functions like C++)促使Eric Lippert写了blog post原因。在其中,他解释说:

  

我被问到“为什么C#不实现功能X?”每时每刻。答案总是一样的:因为没有人设计,指定,实施,测试,记录和发送该功能。所有这六件事都是实现这一功能所必需的。所有这些都耗费了大量的时间,精力和金钱。功能并不便宜,我们非常努力地确保我们只提供那些能够为我们的用户提供最佳利益的功能,因为我们的时间,精力和预算都有限。

怀疑这可能是为什么.Net没有附带优先级队列的答案 - 没有足够的时间,精力,金钱,需求(?)来实现一个。

答案 1 :(得分:4)

.NET 4.0引入了SortedSet<T>类,以及由ISet<T>SortedSet<T>实现的HashSet<T>接口。这显然会使您更容易实现自己的PriorityQueue<T>类。

但是,仍然没有IQueue<T>接口,这至少可以承认需要优先级队列或基本BCL Queue<T>之外的任何其他实现。同样,没有IStack<T>

就我个人而言,我发现这些最基本的界面缺乏令人失望和短视,特别是因为从现有类中提取简单界面的设计/规范/实现/测试/文档成本确实非常低。 / p>

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

那里,看?我做到了。

答案 2 :(得分:2)

截至 2021 年 1 月,.Net Core 添加了 PriorityQueue 实现。可以在此处找到对存储库和 API 的实际提交:https://github.com/dotnet/runtime/commit/826aa4f7844fd3d48784025ec6d47010867baab4

答案 3 :(得分:2)

这已正式 announced 并在 .NET 6 预览版中。

<块引用>

的PriorityQueue (System.Collections.Generic)是一个新的集合,使添加具有一个值和优先级的新项目。在出队时,PriorityQueue 返回具有最低优先级值的元素。你可以认为这个新的集合类似于队列,但每个排队的元素具有影响离队的行为的优先级值。

以下示例演示了 PriorityQueue 的行为。

// creates a priority queue of strings with integer priorities
var pq = new PriorityQueue<string, int>();

// enqueue elements with associated priorities
pq.Enqueue("A", 3);
pq.Enqueue("B", 1);
pq.Enqueue("C", 2);
pq.Enqueue("D", 3);

pq.Dequeue(); // returns "B"
pq.Dequeue(); // returns "C"
pq.Dequeue(); // either "A" or "D", stability is not guaranteed.

答案 4 :(得分:0)

请参见:Add PriorityQueue to Collections,他们花了 farking 5年,仍然没有PriorityQueue。