Почему в .NET-инфраструктуре нет класса очереди приоритетов?
Есть несколько потоков в переполнении стека, связанных с реализацией очередей приоритетов в .Net и С#.
Моя проблема носит более фундаментальный характер: Почему нет приоритетной очереди из коробки в .NET-инфраструктуре? Даже в стандартной библиотеке С++ есть один.
Ответы
Ответ 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();
}
Там, смотри? Я сделал это.