如何在C#的Reactive Extension中将IObservable<bool>转换为bool?

3
我想检查 System.Reactive.IObserable<TElement> 是否包含任何元素。 Any() 扩展方法不起作用,因为它期望返回 IObserable<bool> 而不是仅仅的 bool。

你为什么要这样做?如果你想在事件发生时执行代码,应该订阅可观察对象,而不是检查事件是否已经发生。 - Panagiotis Kanavos
你说得对,我终于改变了观察者模式的看法。 - Bhalchandra K
1个回答

12

IObservable<bool> IObservable<T>.Any() 这个扩展方法并不无用:它获取一个可观察序列,该序列尽快发出一个 bool 值,表示源可观察序列是否发出了任何值。这是由以下两个事件中的任何一个触发的:

  • 源序列发出 OnCompleted。在这种情况下,它没有发出任何值,因此 Any 序列会先发出 OnNext(false),然后发出 OnCompleted

  • 源序列发出 OnNext。 因此,Any 序列会先发出 OnNext(true),然后发出 OnCompleted

如果您想得到结果的 bool 而不是 IObservable<bool>,则可以在 async 上下文中使用 await 操作符等待 Any 可观察序列。

    IObservable<Prizes> prizes = ...;
    bool winner = await prizes.Any();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接