C# 使用ObservableCollection<;T>;作为FIFO堆栈

C# 使用ObservableCollection<;T>;作为FIFO堆栈,c#,xamarin.forms,C#,Xamarin.forms,我已经建立了一个心率监测设备,我打算从中向我的移动应用程序发送数据 在我的移动应用程序中,我希望将心电图显示为一条动态曲线,该曲线根据设备发送给它的实时数据进行更新 目前,我正在准备要附加到图形中的数据,为此,我编写了一段代码,从外围设备读取数据并将其添加到可观察的集合中: MyDevice.Characteristic.ValueUpdated += (sender, e) => { HrData = new ObservableCollection<string&g

我已经建立了一个心率监测设备,我打算从中向我的移动应用程序发送数据

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

目前,我正在准备要附加到图形中的数据,为此,我编写了一段代码,从外围设备读取数据并将其添加到可观察的集合中:

MyDevice.Characteristic.ValueUpdated += (sender, e) =>
{
       HrData = new ObservableCollection<string>();            
       HrData.Add(System.Text.Encoding.Default.GetString(e.Characteristic.Value));        
};
MyDevice.Characteristic.ValueUpdated+=(发送方,e)=>
{
HrData=新的ObservableCollection();
添加(System.Text.Encoding.Default.GetString(e.Characteristic.Value));
};
现在,由于设备在很短的时间内读取大量数据,我打算在图中只显示20个数据点,这意味着列表应该根据FIFO原则进行更新

我知道,我可以做一个循环,移动我收藏中的每个实体,从而实现这个原则。不过,我确实觉得这是一种“可悲”的做法

  • 有什么方便的方法可以做到这一点吗?i、 e.可观察的堆栈类

ObservableCollection
不支持此方案。您可以做什么:

  • 创建自己的
    INotifyCollectionChanged

  • 或者:子类
    ObservableCollection
    ,在更新内容时暂停通知,然后引发
    重置
    事件

  • 或:每次重新创建集合

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


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

类ObservaleQueue:queue,INotifyCollectionChanged
{
公共可观测设备()
{
}
公共可观测设备(内部容量):基础(容量)
{
}
公共可观察对象(IEnumerable集合):基本(集合)
{
}
公共事件通知CollectionChangedEventHandler CollectionChanged;
公共新空白清除()
{
base.Clear();
如果(this.CollectionChanged!=null)
CollectionChanged(这是新的NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
公共新作废排队(T项)
{
基本。排队(项目);
如果(this.CollectionChanged!=null)
CollectionChanged(这是新的NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add));
}
公共新T退出队列()
{
T item=base.Dequeue();
如果(this.CollectionChanged!=null)
CollectionChanged(这是新的NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove));
退货项目;
}
}

使用?然后在接口中实现它?。。。为什么需要实施它?你为什么不能直接用它呢?无论您想在FIFO队列中存储什么对象,您只需使用队列,这与列表是一样的——您通常不想实现自己的列表——您只需使用ListHmm。也许你终究要实现队列。但是,如果可以让单个对象而不是总体集合可见,那么可能值得一提
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;
    }
}