堆栈溢出上有一些线程在处理实现priority queues in .Net and C#。
我的问题是一个更基本的问题:为什么.Net框架中没有开箱即用的优先级队列?甚至C++标准库都有一个。
发布于 2009-12-14 17:57:28
不久前有一个问题(why C# does allow non-member functions like C++)促使Eric Lippert写了一篇关于原因的blog post。在书中,他解释道:
我被问到“为什么C#不实现特性X?”一直。答案总是一样的:因为从来没有人设计、指定、实现、测试、记录和发布该功能。所有这六件事都是实现一个特性所必需的。所有这些都需要花费大量的时间、精力和金钱。功能并不便宜,我们非常努力地确保,在我们有限的时间、精力和资金预算的情况下,我们只提供那些能给我们的用户带来最佳利益的功能。
我怀疑这可能就是为什么.Net没有提供优先级队列的原因--没有足够的时间、精力、金钱和需求(?)来实现一个。
发布于 2009-12-14 18:29:26
.NET 4.0引入了一个SortedSet<T>
类,以及由SortedSet<T>
和HashSet<T>
实现的ISet<T>
接口。这显然会使实现您自己的PriorityQueue<T>
类变得更简单。
然而,仍然没有IQueue<T>
接口,这至少会承认除了基本的BCL Queue<T>
之外还需要优先级队列或任何其他实现。同样,也没有IStack<T>
。
就我个人而言,我发现缺少一些最基本的接口是令人失望和目光短浅的,特别是从现有类中提取一个简单接口的design/specification/implementation/testing/documentation成本应该非常低。
public interface IQueue<T> : IEnumerable<T>, ICollection, IEnumerable
{
T Dequeue();
void Enqueue(T item);
T Peek();
}
看到了吗?我已经做到了。
发布于 2021-04-09 12:28:30
这是官方的announced版本,并在.NET 6预览版中发布。
PriorityQueue (System.Collections.Generic)是一个新的集合,它允许添加具有值和优先级的新项目。出队时,PriorityQueue返回具有最低优先级值的元素。您可以认为这个新集合类似于Queue,但是每个入队的元素都有一个影响出队行为的优先级值。
下面的示例演示了PriorityQueue的行为。
//创建具有整数优先级的字符串的优先级队列var pq = new PriorityQueue();//将具有关联优先级的元素入队pq.Enqueue( "A“,3);pq.Enqueue( "B”,1);pq.Enqueue( "C“,2);pq.Enqueue("D",3);pq.Dequeue();//返回”B“pq.Dequeue();//返回”C“pq.Dequeue();//无论是”A“还是"D",不保证稳定性。
https://stackoverflow.com/questions/1899905
复制相似问题