Почему.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 все еще нет.

Другие вопросы по тегам