列表,当我添加新项目时,它会自动删除最旧的项目
本文关键字:删除 项目 添加 新项目 列表 | 更新日期: 2024-09-17 01:31:48
我需要C#中的一个类来存储不超过最后N个项目,方法如下:
Add(T item) {
if (mylist.Count >= N)
remove the first(oldest) item;
add a new item to the tail;
}
以及获取指定索引处的项的属性
因此,正确的方法可能是将我的类基于其中一个类:List、Queue、ConcurrentQueue、Dequeue(可能有所不同?)。当然,类应该为头部和尾部提供相等的访问时间
问题是,对我来说,什么课程最容易被接受?
使用LinkedList(t)来执行此操作。这会给你一个第一、最后和计数。这样,一旦计数达到某一点,就可以删除最后一个。
myList = new LinkedList();
Add(T item){
if (myList.Count >= N)
myList.RemoveLast();
myList.AddFirst(item);
}
在这种情况下,最后一项是最旧的,而第一项是最新的。
所以我报告了我的研究。C#中的类List<T>
实际上是一个向量,而不是计算机科学中定义的列表。LinkedList<T>
实际上是一个列表,但具有双重链接
我写了很简单的课来解决我的任务。
/// <summary>
/// Fixed-size buffer. When the buffer is full adding a new item removes the first item,
/// so buffer stores the last N (where N is a size) adding items.
/// Reading is provided by indexing, rewriting isn't allowed.
/// Buffer could be changed by using method Add only.
/// </summary>
public class RingBuffer<T> {
int size;
T[] ringbuffer;
int i0 = 0, count = 0;
int getIndex(int i) {
int k=i0+i;
return k < count ? k : k-size;
}
public RingBuffer(int size) {
this.size = size;
ringbuffer = new T[size];
}
public int Count {
get { return count; }
}
public bool isFull {
get { return count == size; }
}
public T this[int i] {
get { return ringbuffer[getIndex(i)]; }
}
public void Add(T item) {
if (isFull)
// rewrite the first item
ringbuffer[i0++] = item;
else
ringbuffer[count++] = item;
}
}