Priority Queue



В .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 придётся реализовывать самому.



Больше прочитать про внутреннее устройство класса можно в статье Вадима Мартынова на Хабре