c# – 如何根据事件中的条件完成Rx Observable

我有一个我无法控制的事件为我提供了数据. eventArgs看起来像这样:
class MyEventArg {
  bool IsLastItem {get;}
  Data DataItem {get;}
}

我使用Rx将此事件转换为IObservable.但是如果IsLastItem为真,我想完成observable.

任何优雅的想法?一种方法是通过我可以控制的主题来管道数据,以便在条件发生时设置OnComplete事件…

解决方法

如果要包含最后一个元素,则可以将流与仅包含最后一个元素以及与TakeWhile结合的常规流合并.
这是一个简单的控制台应用程序来证明它:
var subject = new List<string>
{                            
"test","last"
}.ToObservable();

var my = subject
            .Where(x => x == "last").Take(1)
            .Merge(subject.TakeWhile(x => x != "last"));

my.Subscribe(
    o => Console.WriteLine("On Next: " + o),() => Console.WriteLine("Completed"));

Console.ReadLine();

这打印:

On Next: test
On Next: last
Completed

UPDATE
如果底层的Observable实际上没有完成,则有一个错误压制了OnCompleted消息.我更正了代码以确保调用OnCompleted

如果你想避免为冷可观察量多次订阅底层序列,你可以像这样重构代码:

var my = subject.Publish(p => p
            .Where(x => x == "last").Take(1)
            .Merge(p.TakeWhile(x => x != "last")));

相关文章

项目中经常遇到CSV文件的读写需求,其中的难点主要是CSV文件...
简介 本文的初衷是希望帮助那些有其它平台视觉算法开发经验的...
这篇文章主要简单记录一下C#项目的dll文件管理方法,以便后期...
在C#中的使用JSON序列化及反序列化时,推荐使用Json.NET——...
事件总线是对发布-订阅模式的一种实现,是一种集中式事件处理...
通用翻译API的HTTPS 地址为https://fanyi-api.baidu.com/api...