将集合的n个元素保留在c#中的最佳方法是什么?
添加新元素时删除旧元素。
这就是我所做的:
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();
}
还有其他方法吗?
答案 0 :(得分:5)
您想要的是circular buffer。有很多实现。 Here is one。
在时间和空间上都是高效的;在时间上是因为插入是 O(1);在空间上是因为新元素会覆盖最旧的就地。
您的第一次尝试效率不高,因为RemoveAt(0)
为 O(n),因为元素必须移动。
第二个还不错,但是在分配新的插槽和删除旧的插槽方面有一些开销。
第三次尝试是最好的,因为.NET队列 被强加为循环缓冲区,但是在调整大小方面存在一些开销。由于您不必担心调整大小,因此使用固定大小的真正圆形缓冲区会更有效率。