我应该如何解析和延迟热反应扩展IConnectableObservable <t>流?

时间:2015-08-14 12:07:19

标签: datetime system.reactive

我无法实现这一点,所以很遗憾,我没有Rx代码来显示我的位置。我将解释我想做什么,希望有足够专业知识的人可以指导我朝着正确的方向前进。

让我们说我有一个List TimeObjects的集合,我从数据库中提取。 TimeObject有这种形式。

public class TimeObject
{
   public    DateTime time{get;set;}
   public    decimal  price{get;set;}
}

我想要做的是生成一个Hot IConnectableObservable流,其中每个元素以可变的时间延迟分隔。

可变时间延迟等于当前时间与下一个TimeObject之间的时间差。

例如,如果流是这样的:

s1,s2,s3,... sN,其中每个&#39;表示TimeObject的元素

然后,s2被推出到流之前的时间延迟是(s2.time - s1.time), s3被推出到流之前的时间延迟是(s3.time - s2.time),依此类推。

这是否可能,如果是这样,我的实现应该是什么样的?

我已经包含了一个使用经典方法完成相同任务的for循环。

        FireEvent(TimeObject[0]); //Post the first element as an event

        for(int _counter = 0; _counter < TimeObject.Count; _counter++)
        {
            if ( _counter + 1 < TimeObject.Count )
            {
                TimeObject timeObjectA = TimeObject[_counter];

                TimeObject timeObjectB = TimeObject[_counter + 1];

                int millisecondsDelay = (timeObjectB.time - timeObjectA.time).Milliseconds;

                Thread.Sleep(millisecondsDelay);

                FireEvent(timeObjectB);   //this posts the latest tick as an event with variable time delay.
            }

我希望将其转换为Observable流。

感谢。

1 个答案:

答案 0 :(得分:2)

试试这个:

var observable =
    Observable
        .Generate(
            1,
            x => x < timeObjects.Count,
            x => x + 1, x => timeObjects[x],
            x => timeObjects[x].time.Subtract(timeObjects[x - 1].time)))
        .StartWith(timeObjects[0]);

现在,这是一个常规的冷观察。你可以通过拨打.Publish()来加热。为什么你需要它热?

它还要求您的列表至少包含两个元素