从列表中删除旧值

时间:2010-10-24 14:10:43

标签: c# .net collections

我有一个列表,我希望能够存储20个值。什么是删除旧值的好方法。一个更好的例子是,想象一下改变历史,我不能存储20个最新的变化,而旧的变化则会消失。

C#中是否有一个特殊的东西让我这样做,或者我必须自己制作或使用删除功能。

EDIT1:好吧,如何存储4000 - 10000个值,突然一个链表看起来很有吸引力。

EDIT2:循环列表很好但是我不希望能够循环我的旧值。

EDIT3:对于我的问题,随机访问不是太重要,但顺序访问是。

5 个答案:

答案 0 :(得分:2)

使用队列。每次进入队列时检查size == 20.如果是,则出列/弹出一个元素

答案 1 :(得分:1)

听起来你在描述一个环形缓冲区。 How would you code an efficient Circular Buffer in Java or C#可能会有所帮助。

答案 2 :(得分:0)

没有可以处理的内置集合,但您可以轻松制作一个:

public class LimitedList<T> : List<T> {

  public new void Add(T item) {
    if (Count == 20) {
      RemoveAt(0);
    }
    base.Add(item);
  }

}

请注意,目前这仅处理使用Add方法添加项目时的限制,而不是AddRangeInsert等其他方法。此外,正如SLask指出的那样,List<T>类并不是专门用于继承的(虽然它没有标记为final),因此更强大的实现将封装列表而不是继承它。

另请注意,删除大型列表中的第一个项目效率很低,但如果项目少于20个,则没有问题。如果你需要更大的集合,LinkedList会更好地处理它。

答案 3 :(得分:0)

您可以创建自己的列表类:

public class BoundedList<T> : Collection<T> {
    public int MaxSize { get; private set; }
    public BoundedList(int MaxSize) : base(new List<T>(maxSize)) {
        MaxSize = maxSize;
    }
    protected override void InsertItem(T item, int index) {
        base.InsertItem(item, index)
        if (Count > MaxSize)
            Remove(0);
    }
}

答案 4 :(得分:0)

好吧,我终于有机会自己思考这个问题,并且在没有经过太多努力的情况下找到了一个很好的妥协。为什么不使用链表。

  1. 对于历史记录类型的实现,只需跟踪指针。
  2. 测序操作仍然是线性时间。
  3. 删除最后一个值可以在恒定时间内完成。
  4. 我想我没有提到随机访问并不太重要......