2012-12-31 27 views
2

有什麼辦法來限制泛型集合的大小?限制泛型集合的大小?

我有一堆WriteableBitmap,我用它來存儲每次更改時WriteableBitmap的克隆,這意味着我可以通過簡單地從堆棧中彈出最新的WriteableBitmap來輕鬆撤銷。

問題是內存使用情況,我想限制這個堆棧以容納10個對象,但我看不到一個屬性允許我輕鬆地做到這一點。有沒有辦法,或者我將不得不在每次更改時檢查堆棧大小,並且每當我打開10時以及每次後續更改時,將最後10個對象複製到新堆棧中?我知道如何做到這一點,但希望有一個更簡單的方法,是嗎?

+4

您可以創建自己的集合(例如,從現有的派生),你可以重寫添加方法並在那裏實現您的尺寸檢查邏輯... – nemesv

回答

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

} 
+0

這是我認爲的初始容量,它會隨着您的需要而增加,這是我試圖避免的! – JMK

+1

@JMK,是的,我錯過了,編輯了我的回答 – Habib

+0

不應該在Push方法中的IF條件是相反的,比如(this.Count Maarten

1

您必須檢查大小(如果您設定上限,你會得到一個例外,我相信,不檢查它是否是滿的)。

編輯

如果大小設置你不會得到一個例外,但尺寸僅僅增加了,這樣你就必須檢查大小(通過http://msdn.microsoft.com/en-us/library/6335ax0f.aspx): -

如果Count已經等於容量,堆棧的容量是 通過自動重新分配內部數組而增加,並且在添加新元素 之前將現有元素複製到新數組。

17

爲了詳細說明提拉克的回答下面是一些示例代碼:

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