Подтвердить что ты не робот

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

Есть несколько потоков в переполнении стека, связанных с реализацией очередей приоритетов в .Net и С#.

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

4b9b3361

Ответ 1

Был вопрос давным-давно (почему С# разрешает не-членные функции, такие как С++), что побудило Эрика Липперта написать сообщение в блоге о причинах. В нем он объясняет:

Меня спрашивают: "Почему С# не реализует функцию X?" все время. Ответ всегда один и тот же: поскольку никто не проектировал, не определял, не реализовывал, не тестировал, не документировал и не отправлял эту функцию. Все шесть из этих вещей необходимы, чтобы сделать функцию. Все они стоят огромного количества времени, усилий и денег. Особенности не из дешевых, и мы очень стараемся удостовериться, что мы отправляем только те функции, которые дают наилучшие преимущества нашим пользователям, учитывая наши ограниченные временные, финансовые и денежные бюджеты.

Я подозреваю, что это, вероятно, ответ на вопрос, почему .Net не поставляется с очередью приоритетов - для реализации одного из них было недостаточно времени, усилий, денег, спроса (?).

Ответ 2

.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();
}

Там, смотри? Я сделал это.