Priority Queue
В .NET 6 завезли такую настоящую объекто-ориентированную очередь с приоритетами.
Объектно-ориентированная в смысле поддержки своих формальных типовых параметров:
▪️
▪️
По сути своей, это сортирующая коллекция, в которой приоритет выступает ключом сортировки.
Причём в конструктор очереди, можно передать экземпляр
Получается, можно постоянно туда что-то докидывать и получать отсортированные подвыборки, помимо решения задачи приоритизирования.
Из недостатков можно отметить, что класс
Больше прочитать про внутреннее устройство класса можно в статье Вадима Мартынова на Хабре
В .NET 6 завезли такую настоящую объекто-ориентированную очередь с приоритетами.
Объектно-ориентированная в смысле поддержки своих формальных типовых параметров:
▪️
TElement
- тип содержимого очереди▪️
TPriority
- тип приоритета содержимого очередиПо сути своей, это сортирующая коллекция, в которой приоритет выступает ключом сортировки.
Причём в конструктор очереди, можно передать экземпляр
IComparer<T>
, чтобы, например, определить направление сортировки:// сортируем по убыванию некоторой даты
var queue = new PriorityQueue<string, DateTimeOffset>(
Comparer<DateTimeOffset>.Create((x, y) => y.CompareTo(x)));
queue.Enqueue("abv", DateTimeOffset.UtcNow.Subtract(TimeSpan.FromDays(2)));
queue.Enqueue("ghj", DateTimeOffset.UtcNow.Subtract(TimeSpan.FromDays(3)));
queue.Enqueue("123", DateTimeOffset.UtcNow.Subtract(TimeSpan.FromDays(1)));
while (queue.TryDequeue(out var card, out var addedOn))
{
Console.WriteLine($"{card}, {addedOn}");
}
// чтение выведет: 123 | abv | ghj
Получается, можно постоянно туда что-то докидывать и получать отсортированные подвыборки, помимо решения задачи приоритизирования.
Из недостатков можно отметить, что класс
PriorityQueue<TElement, TPriority>
не реализует никаких LINQ интерфейсов, или интерфейсов коллекций, поэтому совместимость с другими API придётся реализовывать самому.Больше прочитать про внутреннее устройство класса можно в статье Вадима Мартынова на Хабре