Почему.NET Framework не имеет класса очереди приоритетов?
В переполнении стека есть несколько потоков, занимающихся реализацией очередей с приоритетами в.Net и C#.
Моя проблема носит более базовый характер: почему в платформе.Net нет очереди приоритетов из коробки? Даже в стандартной библиотеке C++ есть такая.
6 ответов
Некоторое время назад возник вопрос ( почему C# допускает функции, не являющиеся членами, такие как C++), что побудило Эрика Липперта написать сообщение в блоге о причинах этого. В этом он объясняет:
Меня спрашивают "почему C# не реализует функцию X?" все время. Ответ всегда один и тот же: потому что никто никогда не проектировал, не определял, не реализовывал, не тестировал, не документировал и не поставлял эту функцию. Все шесть из этих вещей необходимы для реализации какой-либо функции. Все они стоят огромных затрат времени, сил и денег. Функции недешевы, и мы очень стараемся, чтобы мы поставляли только те функции, которые дают наилучшие возможные преимущества нашим пользователям, учитывая наши ограниченные затраты времени, усилий и денег.
Я подозреваю, что это, вероятно, ответ на вопрос, почему.Net не поставляется с очередью с приоритетом - просто не хватило времени, усилий, денег, спроса (?) Для ее реализации.
.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();
}
Там видишь? Я сделал это.
Об этом было официально объявлено , и оно находится в предварительной версии .NET 6.
PriorityQueue<TElement, TPriority> (System.Collections.Generic) — это новая коллекция, которая позволяет добавлять новые элементы со значением и приоритетом. При исключении из очереди PriorityQueue возвращает элемент с наименьшим значением приоритета. Эту новую коллекцию можно представить как похожую на Queue, но каждый помещенный в очередь элемент имеет значение приоритета, влияющее на поведение удаления из очереди.
В следующем примере демонстрируется поведение PriorityQueue<string, int>.
// creates a priority queue of strings with integer priorities var pq = new PriorityQueue<string, int>(); // enqueue elements with associated priorities pq.Enqueue("A", 3); pq.Enqueue("B", 1); pq.Enqueue("C", 2); pq.Enqueue("D", 3); pq.Dequeue(); // returns "B" pq.Dequeue(); // returns "C" pq.Dequeue(); // either "A" or "D", stability is not guaranteed.
По состоянию на январь 2021 года в .Net Core добавлена реализация PriorityQueue. Фактическую фиксацию репо и API можно найти здесь: https://github.com/dotnet/runtime/commit/826aa4f7844fd3d48784025ec6d47010867baab4
Теперь он доступен как часть .NET6. Ознакомьтесь со следующим сообщением в блоге для реализации.
https://dotnetcoretutorials.com/2021/03/17/priorityqueue-in-net/
Смотрите это: добавьте PriorityQueue в коллекции, они займут 5 лет, а PriorityQueue все еще нет.