Наблюдаемый Что?
-
07-07-2019 - |
Вопрос
Кто-нибудь написал версию общей очереди .Net, которая реализует INotifyCollectionChanged, или она уже где-то спрятана глубоко в среде .Net?
Решение
Быстрый поиск не дал результатов. Но интерфейс прост, и было бы почти тривиально расширить класс Queue и добавить поддержку интерфейса. Просто переопределите все методы следующим образом:
// this isn't the best code ever; refactor as desired
protected void OnCollectionChanged( NotifyCollectionChangedEventArgs ccea){
var temp = CollectionChanged;
if(temp != null) temp(this, ccea);
}
// and later in the class
public override SomeMethodThatAltersTheQueue(object something){
// record state of collection prior to change
base.SomeMethodThatAltersTheQueue(something)
// create NotifyCollectionChangedEventArgs with prior state and new state
OnCollectionChanged(ccea);
}
Другие советы
Я использовал тот же подход, что и Крис Уэнам. Под нагрузкой снижается производительность, потому что для каждого Enqueue / Dequeue необходимо размещать новые NotifyCollectionChangedEventArgs.
В любом случае, в Enqueue отправьте аргументы с NotifyCollectionChangedAction.Add, добавленным элементом и Count-1 в качестве индекса. В очереди отправьте аргументы с помощью NotifyCollectionChangedAction.Remove, элемент удален и индекс 0.