限制泛型集合的大小

本文关键字:集合 泛型 | 更新日期: 2023-09-27 17:50:27

是否有办法限制泛型集合的大小?

我有一个WriteableBitmap堆栈,我用它来存储每次更改时WriteableBitmap的克隆,这意味着我可以通过简单地从堆栈中弹出最近的WriteableBitmap来轻松撤销。

问题是内存使用,我想限制这个堆栈容纳10个对象,但我看不到一个属性允许我轻松地做到这一点。是否有一种方法,或者我必须在每次更改时检查堆栈大小,并在每次更改时将最后10个对象复制到新堆栈中?我知道怎么做,但我希望有更简单的方法,对吧?

限制泛型集合的大小

为了详细说明Tilak的答案,这里有一些示例代码:

  public class LimitedSizeStack<T> : LinkedList<T>
  {
    private readonly int _maxSize;
    public LimitedSizeStack(int maxSize)
    {
      _maxSize = maxSize;
    }
    public void Push(T item)
    {
      this.AddFirst(item);
      if(this.Count > _maxSize)
        this.RemoveLast();
    }
    public T Pop()
    {
      var item = this.First.Value;
      this.RemoveFirst();
      return item;
    }
  }

您必须实现自己的包装器来实现这一点。没有直接的选择。

class FixedSizeStack : Stack
{
    private int MaxNumber;
    public FixedSizeStack(int Limit)
        : base()
    {
        MaxNumber = Limit;
    }
    public override void Push(object obj)
    {
        if (this.Count < MaxNumber)
            base.Push(obj);
    }
}

你可以使用LinkedList来模拟循环堆栈。

可以用AddFirst()对应Push()。如果Count为10,则可以使用RemoveLast()

对于Pop(),可以使用RemoveFirst()

你必须检查大小(我相信如果你设置了一个限制,你会得到一个异常,而不检查它是否已满)。

编辑

你不会得到一个异常,如果大小已经设置,但大小只是增加,所以你必须检查大小(通过http://msdn.microsoft.com/en-us/library/6335ax0f.aspx):-

)

如果Count已经等于capacity,则Stack的容量为通过自动重新分配内部数组来增加现有元素在新元素之前被复制到新数组中添加.