【问题标题】:ObservableQueue?可观察队列?
【发布时间】:2008-11-11 15:00:07
【问题描述】:

有没有人编写过实现 INotifyCollectionChanged 的​​ .Net 通用队列版本,或者是否已经在 .Net 框架深处某个地方隐藏了一个?

【问题讨论】:

    标签: .net-3.5 queue inotifycollectionchanged


    【解决方案1】:

    快速搜索未显示任何结果。但是接口很简单,扩展 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);
    }
    

    【讨论】:

    • 不幸的是,.Net 通用 Queue 类不允许在后代类中覆盖 Enqueue() 或 Dequeue()。
    • 我最终创建了一个 ObservableQueue 类,它使用方法隐藏来覆盖 Enqueue() 和 Dequeue()。只要代码入队或出队在 Queue As ObservableQueue 上进行,而不仅仅是作为常规队列多态,事件就会触发。
    • 一个更好的方法可能不是重写而是创建一个新队列(没有 IQueue 接口!很奇怪!),它在构造函数中接受一个 Queue 并将方法调用传递给内部收藏
    【解决方案2】:

    我使用了与 Chris Wenham 相同的方法。在负载下,性能会受到影响,因为需要为每个 Enqueue/Dequeue 分配新的 NotifyCollectionChangedEventArgs。

    无论如何,在 Enqueue 中,以 NotifyCollectionChangedAction.Add、添加的项目和 Count-1 作为索引发送 args。在 Dequeue 中,发送带有 NotifyCollectionChangedAction.Remove 的 args、已删除的项目和索引 0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      • 2015-02-18
      • 2018-12-12
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多