Кто-нибудь написал версию универсальной очереди .Net, которая реализует INotifyCollectionChanged, или где-то уже есть одна скрытая глубоко в структуре .Net?
Наблюдаемая очередь?
Ответы (2)
Быстрый поиск результатов не дал. Но интерфейс прост, и было бы почти тривиально расширить класс 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);
}
person
Community
schedule
11.11.2008
К сожалению, универсальный класс Queue .Net не позволяет переопределять Enqueue() или Dequeue() в классе-потомке.
- person Chris Wenham; 11.11.2008
В итоге я создал класс ObservableQueue, который использует скрытие методов для переопределения Enqueue() и Dequeue(). Пока код, помещающий в очередь или удаляющий из очереди, делает это в очереди как ObservableQueue, а не только полиморфно, как в обычной очереди, события будут срабатывать.
- person Chris Wenham; 14.11.2008
Лучше не переопределять, а создать новую очередь (без интерфейса IQueue‹T›! странно!), которая принимает Queue‹T› в конструкторе и просто передает вызовы методов во внутреннюю коллекцию
- person ; 17.11.2008
Я использовал тот же подход, что и Крис Уэнам. Под нагрузкой производительность снижается, поскольку для каждой постановки в очередь/удаления из очереди необходимо выделить новые NotifyCollectionChangedEventArgs.
Несмотря на это, в Enqueue отправьте аргументы с NotifyCollectionChangedAction.Add, добавленным элементом и Count-1 в качестве индекса. В Dequeue отправьте аргументы с NotifyCollectionChangedAction.Remove, удаленным элементом и индексом 0.
person
Ed Noepel
schedule
18.09.2009