限制泛型集合的大小?

时间:2012-12-31 11:59:09

标签: c# generic-collections

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

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

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

4 个答案:

答案 0 :(得分:21)

详细说明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;
    }
  }

答案 1 :(得分:6)

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

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

}

答案 2 :(得分:3)

您可以使用代表双重链接列表的LinkedList来模拟Circular Stack

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

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

答案 3 :(得分:1)

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

修改

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

  

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