【问题标题】:Limit the size of a generic collection?限制通用集合的大小?
【发布时间】:2012-12-15 14:18:09
【问题描述】:

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

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

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

【问题讨论】:

  • 您可以创建自己的集合(例如从现有集合派生),您可以覆盖 add 方法并在那里实现您的大小检查逻辑...

标签: c# generic-collections


【解决方案1】:

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

【讨论】:

  • 在这种情况下不建议使用继承。原始方法仍然存在,并且通过它们的使用,可能会超出最大大小。
【解决方案2】:

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

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

}

【讨论】:

  • 这是我认为的初始容量,它会随着您的需要而增加,我正在努力避免!
  • 在这种情况下不建议使用继承。这个答案违反了 LSP,它改变了 Push 方法的合同。不过使用组合很好,只需要编写更多代码来公开需要存在于 FixedSizeStack 中的 Stack 成员。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

    编辑

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

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

    【讨论】:

      猜你喜欢
      • 2020-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-07
      • 2013-03-27
      • 1970-01-01
      • 2023-01-01
      相关资源
      最近更新 更多