using System.Collections.Generic;
public static class Program
public static void Main()
PriorityQueue<object, (char, int)> queue = new(Comparer<(char, int)>.Create((x, y) =>
int result = x.Item1.CompareTo(y.Item1);
if (result == 0) result = x.Item2.CompareTo(y.Item2);
for (int i = 0; i < 100_000; i++)
char key = (char)random.Next(65, 91);
queue.Enqueue(new object(), (key, i));
while (queue.Count > 1_000) queue.Dequeue();
long mem0 = GC.GetTotalAllocatedBytes(true);
long mem1 = GC.GetTotalAllocatedBytes(true);
Console.WriteLine($"Count: {queue.Count:#,0}, Allocated: {mem1 - mem0:#,0} bytes");
Console.WriteLine($"Desirable maximum: {System.Runtime.CompilerServices.Unsafe.SizeOf<(object, char)>() * queue.Count:#,0} bytes");
if (queue.TryPeek(out _, out (char, int) firstKey))
Console.WriteLine($"First key: {firstKey}");
public static void Reindex<TElement, TPriority>(
this PriorityQueue<TElement, (TPriority, int)> source)
ArgumentNullException.ThrowIfNull(source);
(TElement, (TPriority, int))[] entries = source.UnorderedItems
.OrderBy(e => e.Priority, source.Comparer)
for (int i = 0; i < entries.Length; i++)
source.Enqueue(entries[i].Item1, (entries[i].Item2.Item1, i));