代码之家  ›  专栏  ›  技术社区  ›  Jeppe Christensen

使用ObservableCollection<T>作为FIFO堆栈

  •  1
  • Jeppe Christensen  · 技术社区  · 6 年前

    在我的移动应用程序中,我希望将心电图显示为一条动态曲线,该曲线根据设备发送给它的实时数据进行更新。

    MyDevice.Characteristic.ValueUpdated += (sender, e) =>
    {
           HrData = new ObservableCollection<string>();            
           HrData.Add(System.Text.Encoding.Default.GetString(e.Characteristic.Value));        
    };
    

    现在,由于设备在很短的时间内读取大量数据,我打算在图中只显示20个数据点,这意味着列表应该根据FIFO原则进行更新。

    • 有什么方便的方法可以做到这一点吗?i、 e.可观察的堆栈类。
    3 回复  |  直到 6 年前
        1
  •  2
  •   Kevin    6 年前

    我认为你基本上是在寻找一个队列。队列是先进先出机制(与堆栈相反,堆栈是先进后出机制)

        2
  •  0
  •   Andy    6 年前

    ObservableCollection 不支持此场景。您可以做什么:

    • INotifyCollectionChanged

    • 或:子类 可观测收集 ,在更新内容时挂起通知,然后引发 Reset 事件

    • 或者:创建两个单独的集合,并在它们之间切换:在更新B时暴露A,然后在更新A时暴露B

        3
  •  0
  •   youzer    6 年前
    class ObservableQueue<T> : Queue<T>, INotifyCollectionChanged
    {
        public ObservableQueue()
        {
        }
    
        public ObservableQueue(int capacity) : base(capacity)
        {
        }
    
        public ObservableQueue(IEnumerable<T> collection) : base(collection)
        {
        }
    
        public event NotifyCollectionChangedEventHandler CollectionChanged;
    
        public new void Clear()
        {
            base.Clear();
            if(this.CollectionChanged != null)
                CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
        }
    
        public new void Enqueue(T item)
        {
            base.Enqueue(item);
            if (this.CollectionChanged != null)
                CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add));
        }
    
        public new T Dequeue()
        {
            T item = base.Dequeue();
            if (this.CollectionChanged != null)
                CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove));
            return item;
        }
    }