首页 > 解决方案 > 如何始终保留集合的 n 个元素?

问题描述

在 c# 中保留集合的 n 个元素的最佳方法是什么?

添加新元素时删除旧元素。

保留集合的 n 个元素

这就是我所做的:

List<int> listOf5Elements = new List<int>();
for(var i = 0; i<200; i++)
{
    listOf5Elements.Add(i);
    if (listOf5Elements.Count() == 6)
        listOf5Elements.RemoveAt(0);
}

LinkedList<int> linkedOf5elements = new LinkedList<int>();
for (var i = 0; i < 200; i++)
{
    linkedOf5elements.AddLast(i);
    if (linkedOf5elements.Count() == 6)
        linkedOf5elements.RemoveFirst();
}

Queue<int> queueOf5Elements = new Queue<int>();
for (var i = 0; i < 200; i++)
{
    queueOf5Elements.Enqueue(i);
    if (queueOf5Elements.Count() == 6)
        queueOf5Elements.Dequeue();
}

还有其他方法吗?

标签: c#collections

解决方案


你想要的是一个循环缓冲区。那里有很多实现。这是一个

它在时间和空间上都很有效;在时间上是因为插入是O(1),在空间上是因为新元素会覆盖最旧的就地元素。

您的第一次尝试效率不高,因为RemoveAt(0)O (n)因为元素必须移动。

第二个还不错,但是在分配新插槽和删除旧插槽时会产生一些开销。

第三次尝试是最好的,因为 .NET 队列作为循环缓冲区实现的,但是在调整大小时会产生一些开销。由于您不关心调整大小,因此具有固定大小的真正循环缓冲区会更有效率。


推荐阅读