Почему платформа .NET не имеет приоритетного класса очереди?

Существуют некоторые потоки на Переполнении стека, имеющем дело с реализацией приоритетных очередей в .NET и C#.

Моя проблема имеет более основной характер: Почему не там приоритетная очередь из поля в платформе .NET? Даже Библиотека Стандарта C++ имеет тот.

21
задан Community 23 May 2017 в 12:19
поделиться

2 ответа

There was a question a while ago (why C# does allow non-member functions like C++) which prompted Eric Lippert to write a blog post about the reasons why. In it, he explains:

I am asked "why doesn't C# implement feature X?" all the time. The answer is always the same: because no one ever designed, specified, implemented, tested, documented and shipped that feature. All six of those things are necessary to make a feature happen. All of them cost huge amounts of time, effort and money. Features are not cheap, and we try very hard to make sure that we are only shipping those features which give the best possible benefits to our users given our constrained time, effort and money budgets.

I suspect that is probably the answer to why .Net does not ship with a priority queue - there was just not enough time, effort, money, demand(?) to implement one.

12
ответ дан 29 November 2019 в 22:02
поделиться

.NET 4.0 представляет класс SortedSet вместе с интерфейсом ISet , который реализуется посредством SortedSet < T> и HashSet . Это, очевидно, упростит реализацию собственного класса PriorityQueue .

Однако до сих пор нет интерфейса IQueue , который хотя бы допускал необходимость для приоритетных очередей или любой другой реализации, кроме базовой BCL Queue . Точно так же нет IStack .

Лично я нахожу отсутствие некоторых из этих базовых интерфейсов разочаровывающим и недальновидным, особенно с учетом того, что стоимость проектирования / спецификации / реализации / тестирования / документации для извлечения простого интерфейса из существующего класса должна быть действительно очень низкой.

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

Вот, видите? Я сделал это.

4
ответ дан 29 November 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: