我需要在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(可能是不同的东西?)。当然,课程应该为头部和尾部提供平等的访问时间 问题是,哪个班级最适合我的目的?
答案 0 :(得分:1)
使用LinkedList(t)执行此操作。这给你一个First,Last和Count。这样一旦计数到达某个点,就可以删除最后一个。
myList = new LinkedList();
Add(T item){
if (myList.Count >= N)
myList.RemoveLast();
myList.AddFirst(item);
}
在这种情况下,最后一项是最旧的,第一项是最新项。
答案 1 :(得分:0)
所以我报告了我的研究。
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;
}
}