如何从一个事件序列切换到另一个事件序列?

时间:2012-12-26 14:33:51

标签: system.reactive composition deferred

我希望第一个事件到来会导致一些工作。后来我想减少工作量。到现在为止,我带来了以下代码:

var events = Observable.FromEventPattern<...>(...);

var throttled = events.Throttle(TimeSpan.FromSeconds(1));
events.Take(1).Subscribe((x) =>
{
    DoWork(x);
    throttled.Subscribe((y) => DoWork(y);
});

有更优雅的表达方式吗?

2 个答案:

答案 0 :(得分:2)

显然很简单:

var events = Observable.FromEventPattern<...>(...);

var throttled = events.Throttle(TimeSpan.FromSeconds(1));
events.Take(1).Concat(throttled).Subscribe((x) => DoWork(x));

Concat将等待第一个序列完成,然后将订阅移至第二个序列。

答案 1 :(得分:0)

另一种常见的方法是使用select-many。这允许您将数据从第一个序列传递到第二个序列,它还允许两个序列具有不同的类型:

在查询理解语法中;

var q = from x in xs
        from y in ys
        select new {x, y};

- 或者 - 您可以使用标准的linq运算符作为扩展方法(但是不能访问x值)

xs.SelectMany(x=>ys)
  .Select(y=>y)