Ограничить размер общей коллекции?

Есть ли способ ограничить размер общей коллекции?

У меня есть Stack of WriteableBitmap, который я использую для хранения клона записиableBitmap при каждом изменении, что означает, что я могу легко отменить, просто выставив самую последнюю WriteableBitmap из стека.

Проблема в использовании памяти, я хочу ограничить этот стек хранением 10 объектов, но я не вижу свойства, позволяющего мне легко это сделать. Есть ли способ, или мне придется проверять размер стека при каждом изменении и копировать последние 10 объектов в новый стек всякий раз, когда я нажимаю 10, и при каждом последующем изменении? Я знаю, как это сделать, но надеялся, что есть более простой способ, есть ли?

4 ответа

Для этого вам нужно реализовать свою собственную оболочку. Прямого выбора нет.

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


Чтобы уточнить ответ Тилака, вот пример кода:

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


Вы можете использовать LinkedList, который представляет собой двойной список ссылок для имитации Циркулярный стек.

Вы можете AddFirst() соответствовать Push(). Если Count равно 10, вы можете использовать RemoveLast().

Для Pop() вы можете использовать RemoveFirst()


Вам нужно будет проверить размер (вы получите исключение, которое я считаю, если вы установили предел, и не проверяйте его полноту).

Изменить

Вы не получите исключение, если размер был установлен, но размер просто увеличивается, поэтому вам нужно проверить размер (через http://msdn.microsoft.com/en-us/library/6335ax0f.aspx): -

Если граф уже равен емкости, емкость стека увеличивается путем автоматического перераспределения внутреннего массива и существующие элементы копируются в новый массив до нового элемента.

licensed under cc by-sa 3.0 with attribution.