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

Joh*_*ell 21 .net priority-queue standard-library library-design data-structures

Stack Overflow上有一些线程涉及在.Net和C#中实现优先级队列.

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

adr*_*nks 12

前一段时间有一个问题(为什么C#允许像C++这样的非成员函数)促使Eric Lippert写了一篇关于其原因的博客文章.在其中,他解释说:

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

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

  • 时间是优先事项的问题.如果他们说没有足够的时间,那么问题就变成:"为什么*不*包括优先级队列,但*包括xxx?" 并且xxx可以比优先级队列少用.我不知道,也许拿xxx = HybridDictionary.我敢肯定他们有一些本来可以留下来为优先级队列腾出时间的东西. (4认同)
  • 谢谢,阿德里安,我在写这篇文章的时候读过这篇博文.我也有兴趣听听非MS人员的意见 - 框架中实际上不需要数据结构吗?是否可以让所有其他开发者自己实施呢?我知道我的立场,但我可以根据其他人的意见进行调整.:-) (2认同)
  • 要记住的一件事是框架本身利用了框架的内容。以你的例子为例:如果你看一下`HybridDictionary`的用法,它被框架内部使用了很多(特别是`System.Windows.*`和`System.Web.*`)。不需要 `HybridDictionary` 作为框架的使用者(因此不会将其视为优先级队列那样高的优先级)并不一定意味着应该省略 `HybridDictionary` - 它可能需要实现内部和所以被公开曝光。 (2认同)

Mar*_*dle 5

.NET 4.0 引入了一个SortedSet<T>类,以及ISet<T>SortedSet<T>和实现的接口HashSet<T>。这显然会使实现您自己的PriorityQueue<T>类变得更简单。

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

就我个人而言,我觉得缺少这些最基本的接口令人失望和短视,特别是因为从现有类中提取简单接口的设计/规范/实现/测试/文档成本确实应该非常低。

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

在那里,看到了吗?我已经做到了。

  • 该接口是否可用于不可枚举的队列,例如异步通信队列?队列端点怎么样,它们是否应该有自己的接口,以便您只能为代码的一部分提供推送功能,而将拉取功能提供给另一部分?问题不在于编写那 5 行代码,问题在于设计它以便没有人抱怨,并且它在此过程中为 .NET 运行时产生了价值。 (7认同)
  • ck:参见 System.Collections.Generic.Queue&lt;T&gt; Lasse:异步/并发集合没有相同的行为契约,因此它们不需要实现接口。我的观点是 BCL 团队的态度似乎是,如果他们只提供一个构造的实现,就不需要接口,这不是正确的态度。恕我直言。 (3认同)