列表,当我添加新项目时,它会自动删除最旧的项目

本文关键字:删除 项目 添加 新项目 列表 | 更新日期: 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;
    }
}