添加新项目时自动删除最旧项目的列表

时间:2015-03-02 16:48:41

标签: c# list queue

我需要在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(可能是不同的东西?)。当然,课程应该为头部和尾部提供平等的访问时间 问题是,哪个班级最适合我的目的?

2 个答案:

答案 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;
    }
}