使用ObservableCollection <t>作为FIFO堆栈

时间:2018-12-21 18:29:41

标签: c# xamarin.forms

我已经构建了一个心率监测设备,打算从该设备将数据发送到移动应用程序。

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

当前,我虽然很担心准备准备添加到图形中的数据,因此,我编写了一个代码,该代码从外围设备读取数据并将其添加到可观察的集合中:< / p>

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

现在,由于设备正在很小的时间内读取大量数据,因此我打算在图中仅显示20个数据点,这意味着应根据FIFO原理更新列表。

我知道,我可以做一个循环并移动集合中的每个实体,从而实现原理。但是,我确实认为这将是一种“无情”的方式。

  • 是否存在任何方便的方法?即可观察的堆栈类。

3 个答案:

答案 0 :(得分:2)

我认为您从根本上寻找的是队列。队列是先进先出机制(与堆栈相反,后者是先进先出机制)。

答案 1 :(得分:0)

ObservableCollection不支持这种情况。您可以做什么:

  • 创建自己的INotifyCollectionChanged

  • 实现
  • 或:子类ObservableCollection,在更新内容时挂起通知,然后引发Reset事件

  • 或:每次重新创建集合

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

答案 2 :(得分:0)

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;
    }
}