10

ジェネリック コレクションのサイズを制限する方法はありますか?

変更ごとに WriteableBitmap のクローンを格納するために使用している WriteableBitmap の Stack があります。つまり、最新の WriteableBitmap をスタックからポップするだけで簡単に元に戻すことができます。

問題はメモリの使用量です。このスタックを 10 個のオブジェクトを保持するように制限したいのですが、これを簡単に実行できるプロパティが表示されません。方法はありますか、または変更ごとにスタック サイズを確認し、10 に達するたびに最後の 10 個のオブジェクトを新しいスタックにコピーし、その後の変更ごとにコピーする必要がありますか? 私はこれを行う方法を知っていますが、もっと簡単な方法があることを望んでいましたか?

4

4 に答える 4

24

ここでティラックの答えを詳しく説明するには、いくつかのサンプルコードを示します。

  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 がすでに容量に等しい場合、スタックの容量は内部配列を自動的に再割り当てすることによって増加し、新しい要素が追加される前に既存の要素が新しい配列にコピーされます。

于 2012-12-31T12:02:08.010 に答える