Я ищу INotifyCollectionChanged
исполнение Stack
и Queue
. Я мог бы свернуть самостоятельно, но я не хочу изобретать велосипед.Наблюдаемый стек и очередь
ответ
С стеками и очередями (почти по определению) у вас есть только доступ к вершине стека или главы очереди. Это то, что отличает их от List
. (И так, вот почему вы не нашли ни одного)
Для того, чтобы ответить, хотя вы могли бы написать свой собственный, я бы сделал это, выводя из ObservableCollection
, то в случае стека, реализующего Push
как Insert
по смещению 0 (и pop как возвращаемый индекс 0, затем RemoveAt
индекс 0); или с очередью вы можете просто Add
до конца списка до Enqueue
, а захват и удаление первого элемента, как и для стека, для Dequeue
. Операции Insert
, Add
и RemoveAt
будут вызываться на базовом ObservableCollection
и, таким образом, вызвать событие CollectionChanged
, которое должно быть запущено.
Вы также можете сказать, что вы просто хотите связать или уведомление, когда один элемент, который вы должны иметь доступ к изменениям. Вы бы создать свой собственный класс снова, полученный из стека или очереди, и огнь события CollectionChanged вручную, когда:
- Что-то прижимается или извлекается из стека
- Что-то из очереди из очереди
- Something помещается в очередь, когда очередь была ранее пуста
Я столкнулся с той же проблемой и хочу поделиться своим решением с другими. Надеюсь, это кому-то поможет.
public class ObservableStack<T> : Stack<T>, INotifyCollectionChanged, INotifyPropertyChanged
{
public ObservableStack()
{
}
public ObservableStack(IEnumerable<T> collection)
{
foreach (var item in collection)
base.Push(item);
}
public ObservableStack(List<T> list)
{
foreach (var item in list)
base.Push(item);
}
public new virtual void Clear()
{
base.Clear();
this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
public new virtual T Pop()
{
var item = base.Pop();
this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, item));
return item;
}
public new virtual void Push(T item)
{
base.Push(item);
this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));
}
public virtual event NotifyCollectionChangedEventHandler CollectionChanged;
protected virtual void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
this.RaiseCollectionChanged(e);
}
protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
{
this.RaisePropertyChanged(e);
}
protected virtual event PropertyChangedEventHandler PropertyChanged;
private void RaiseCollectionChanged(NotifyCollectionChangedEventArgs e)
{
if (this.CollectionChanged != null)
this.CollectionChanged(this, e);
}
private void RaisePropertyChanged(PropertyChangedEventArgs e)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, e);
}
event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged
{
add { this.PropertyChanged += value; }
remove { this.PropertyChanged -= value; }
}
}
Привет. После ошибки после Pop() «Событие Remove Collection должно указывать позицию позиции». в любом случае, чтобы исправить это? tnx –
base.Count как отсутствующая позиция позиции зафиксировала это для меня. public new virtual T Pop() { var item = base.Pop(); this.OnCollectionChanged (новый NotifyCollectionChangedEventArgs (NotifyCollectionChangedAction.Remove, item, base.Count)); возвращенный товар; } – uli78
Я предпочитаю это решение для принятого ответа. Он позволяет вам поддерживать ожидания производительности и семантику стека/очереди, а не просто имитировать его списком (который, например, дорого стоит удалить с самого начала, по сравнению с очередью). – KChaloux
Очень похоже на класс выше, с несколькими исключениями:
- Publish проп изменены для изменения коллекции для графа
- Override TrimExcess() б/с, что может повлиять на граф
- Сделанные события публичные, поэтому мне не нужно отбрасывать на интерфейс
- Пропускает индекс для сбора, если необходимо,
public class ObservableStack : Stack, INotifyPropertyChanged, INotifyCollectionChanged
{
public ObservableStack(IEnumerable collection) : base(collection) {}
public ObservableStack() { }
public event PropertyChangedEventHandler PropertyChanged = delegate { };
public event NotifyCollectionChangedEventHandler CollectionChanged = delegate { };
protected virtual void OnCollectionChanged(NotifyCollectionChangedAction action, List items, int? index = null)
{
if (index.HasValue)
{
CollectionChanged(this, new NotifyCollectionChangedEventArgs(action, items, index.Value));
}
else
{
CollectionChanged(this, new NotifyCollectionChangedEventArgs(action, items));
}
OnPropertyChanged(ClrExtensions.PropertyName(() => Count));
}
protected virtual void OnPropertyChanged(string propName)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
public new virtual void Clear()
{
base.Clear();
OnCollectionChanged(NotifyCollectionChangedAction.Reset, null);
}
public new virtual T Pop()
{
var result = base.Pop();
OnCollectionChanged(NotifyCollectionChangedAction.Remove, new List() { result }, base.Count);
return result;
}
public new virtual void Push(T item)
{
base.Push(item);
OnCollectionChanged(NotifyCollectionChangedAction.Add, new List() { item }, base.Count - 1);
}
public new virtual void TrimExcess()
{
base.TrimExcess();
OnPropertyChanged(ClrExtensions.PropertyName(() => Count));
}
}
- 1. Стек и очередь сложность,
- 2. Стек и очередь, почему?
- 3. Стек, очередь, дерево?
- 4. Очередь, которая использует стек
- 5. Как отобразить мою очередь и стек?
- 6. Как реализовать стек и очередь в java?
- 7. Внедрить задержанную очередь с RxJs Наблюдаемый
- 8. Raw указатель в векторе станд, стек и очередь
- 9. Я пытаюсь реализовать очередь, которая бы отменила стек и стек FIFO печати?
- 10. массив наблюдаемый с содержимым наблюдаемый и jqАвтокомплект
- 11. Наблюдаемый стек <T> не работает на push
- 12. Очередь заданий и готовая очередь
- 13. CoffeeScript, Нокаут и наблюдаемый
- 14. Java-наблюдатель и наблюдаемый
- 15. запрос наблюдаемый и angularfire2
- 16. Нокаут, наблюдаемый и время
- 17. Наблюдаемый делегат и run_once
- 18. Как создать переменную, которая может хранить очередь или стек?
- 19. Можно ли вставить массив в очередь или стек в Javascript?
- 20. Что происходит быстрее: очередь STL или стек STL?
- 21. Как написать шаблон функции, который может принимать стек или очередь?
- 22. Как связаны стек вызовов и стек оценки?
- 23. стек ядра и стек приложения пользовательского режима
- 24. Наблюдаемый не является асинхронным
- 25. Очередь блокирует и выполняет очередь при готовности
- 26. Наблюдаемый массив и Foreach Списки
- 27. Нокаут ForEach и наблюдаемый массив
- 28. Angular2 - Расширяющийся роутер и наблюдаемый
- 29. Наблюдаемый массив и вычисленная ошибка
- 30. Knockout и наблюдаемый массив несовпадение
Я рекомендую первый подход для «ObservableStack» - получить (или лучше содержать) «ObservableCollection». Второй подход будет лучше для «ObservableQueue» - получить из «Queue» и реализовать ваши собственные уведомления. Это связано с тем, что любой «ObservableQueue», построенный на «List», будет иметь производительность O (N) для «Enqueue» или «Dequeue», тогда как все остальное будет O (1). Это повлияет на производительность, если в очереди будет много элементов. –
Я решил создать общий наблюдаемый класс, который просто реализует INotifyCollectionChanged. Классы вызывают внутренние методы Stack и Queue и поднимают соответствующее событие. Преимущество композиции над наследованием, поскольку методы Stack и Queue не являются виртуальными (у меня возникают проблемы с пониманием причин). – Goran