10

有没有办法限制通用集合的大小?

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

问题是内存使用情况,我想限制这个堆栈容纳 10 个对象,但我看不到允许我轻松执行此操作的属性。有没有办法,或者我是否必须在每次更改时检查堆栈大小,并在我达到 10 时将最后 10 个对象复制到一个新堆栈中,以及每次后续更改时?我知道该怎么做,但希望有更简单的方法,是吗?

4

4 回答 4

24

为了详细说明 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;
    }
  }
于 2013-12-10T09:23:46.600 回答
10

您必须实现自己的包装器才能实现这一目标。没有可用的直接选项。

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);
    }

}
于 2012-12-31T12:01:25.010 回答
4

您可以使用表示双链表的LinkedList来模拟Circular Stack

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

因为Pop()你可以使用RemoveFirst()

于 2012-12-31T12:02:36.703 回答
1

您将不得不检查大小(如果您设置了限制,我相信您会得到一个例外,并且不要检查它是否已满)。

编辑

如果已设置大小,则不会出现异常,但大小只会增加,因此您必须检查大小(通过http://msdn.microsoft.com/en-us/library/6335ax0f.aspx): -

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

于 2012-12-31T12:02:08.010 回答