对30个对象进行优先选择前4个,这个4个根据该对象的Info属性进行判断,它是自定义类型,所以需要用比较器来比较它的大小。
public class CustomType
{
public int? ID { get; set; }
}
public class RecSample
{
public int Name { get; set; }
public int Value { get; set; }
public CustomType Info { get; set; }
public RecSample()
{
Info = new CustomType();
}
}
public class InfoComparer : IComparer<CustomType>
{
public int Compare(CustomType? x, CustomType? y)
{
if (x?.ID == null || y?.ID == null) return 0;
return x.ID.Value.CompareTo(y.ID.Value);
}
}
internal class Program
{
private static void Main(string[] args)
{
Random r = new Random();
List<RecSample> list = new List<RecSample>();
for (int i = 0; i < 30; i++)
{
list.Add(new RecSample
{
Name = r.Next(0, 30),
Value = r.Next(0, 30),
Info = new CustomType { ID = r.Next(0, 30) }
});
}
PriorityQueue<RecSample, CustomType> pq = new PriorityQueue<RecSample, CustomType>(new InfoComparer());
foreach (var item in list)
{
if (pq.Count < 4) //取前4个值
pq.Enqueue(item, item.Info);
else
pq.EnqueueDequeue(item, item.Info);//能用合并的用合并,一定不要入队再出队的两步,浪费效率
}
Console.WriteLine(" " + pq.Count);
while (pq.Count > 0)
Console.WriteLine(pq.Dequeue().Info.ID);
list.Sort((x, y) => Nullable.Compare(x.Info?.ID, y.Info.ID));
foreach (var item in list)
Console.Write(item.Info.ID.ToString() + ",");
Console.ReadKey();
}
}
结果:
也可以在初始化时指定容量大小:
PriorityQueue<RecSample, CustomType> pq = new PriorityQueue<RecSample, CustomType>(5,new InfoComparer());
考虑到选择4个,指定为5,多一个用于比较,进入临时的入队和出队。
PriorityQueue
并不像一般的队列或堆栈一样具有固定的容量限制。当创建一个PriorityQueue
对象时,指定的容量参数通常用于内部数组的初始化,但并不限制队列的实际大小。因此,即使指定了容量为5,队列仍然可以动态增长以容纳更多元素。后面连续增加的话,它仍然会自动扩容。
个人觉得还是设置5吧,后面到4时再入队出队,一直保持最大极限5,这样它一直不会突破最初的容量,也就不会产生扩容情况。