如何始终保持集合的n个元素?

时间:2019-03-08 18:54:17

标签: c# collections

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

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

keep n elements of a collection

这就是我所做的:

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();
}

还有其他方法吗?

1 个答案:

答案 0 :(得分:5)

您想要的是circular buffer。有很多实现。 Here is one

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

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

第二个还不错,但是在分配新的插槽和删除旧的插槽方面有一些开销。

第三次尝试是最好的,因为.NET队列 被强加为循环缓冲区,但是在调整大小方面存在一些开销。由于您不必担心调整大小,因此使用固定大小的真正圆形缓冲区会更有效率。