如果第一个为空,则切换到其他IObservable - c#

我正在编写一个函数,用于检索有关主题的新闻并通过IObservable返回值反馈该新闻。

但是,我有几个新闻来源。我不想使用Merge将这些来源合并为一个。相反,我想做的是按优先级排序-

调用我的函数时,将查询第一个新闻源(产生一个表示该源的IObservable)。
如果该新闻源的IObservable完成而没有返回任何结果,则查询下一个新闻源。
如果第二个来源完成但没有返回结果,则查询最终新闻来源。
这整个行为被包装成一个可观察的状态,我可以返回给用户。

我可以使用内置的Rx扩展方法来完成这种行为吗?还是需要实现一个自定义类来处理此问题?我该怎么做?

参考方案

在我看来,可接受的答案是不可取的,因为它使用SubjectDo,并且在第一个序列不为空时仍订阅第二个序列。如果第二个可观察对象调用任何无关紧要的东西,那么后者可能是一个大问题。我想出了以下解决方案:

public static IObservable<T> SwitchIfEmpty<T>(this IObservable<T> @this, IObservable<T> switchTo)
{
    if (@this == null) throw new ArgumentNullException(nameof(@this));
    if (switchTo == null) throw new ArgumentNullException(nameof(switchTo));
    return Observable.Create<T>(obs =>
    {
        var source = @this.Replay(1);
        var switched = source.Any().SelectMany(any => any ? Observable.Empty<T>() : switchTo);
        return new CompositeDisposable(source.Concat(switched).Subscribe(obs), source.Connect());
    });
}

名称SwitchIfEmpty与existing RxJava implementation一致。 Here是有关将某些RxJava运算符合并到RxNET中的正在进行的讨论。

我敢肯定,自定义IObservable实现将比我的高效。您可以找到一个由ReactiveX成员here编写的akarnokd。它也可以在NuGet上使用。

与哪些运算符>>兼容 - java

我这里没有什么代码int b=3; b=b >> 1; System.out.println(b); 它可以完美工作,但是当我将变量b更改为byte,short,float,double时,它包含错误,但是对于变量int和long来说,它可以完美工作,为什么它不能与其他变量一起工作? 参考方案 位移位运算符(例如>>)与任何整数类型兼…

>> Python中的运算符 - python

>>运算符做什么?例如,以下操作10 >> 1 = 5有什么作用? 参考方案 它是右移运算符,将所有位“右移”一次。二进制10是1010移到右边变成0101这是5

System.Text.Json合并两个对象 - c#

是否可以用System.Text.Json?合并两个这样的json对象对象1{ id: 1 william: "shakespeare" } 对象2{ william: "dafoe" foo: "bar" } 结果对象{ id: 1 william: "dafoe" foo: …

从JAVA调用方法C#.NET - java

我有一个C#.NET项目中创建的dll,我想从Java程序中调用方法。我想知道是否存在实现此目标的机会,然后遇到了JNA和JNI。我应该使用哪一个?有什么建议么?我只需要在使用C#.NET编写的类中调用方法并处理Java程序的结果即可。 参考方案 这取决于您的应用程序,但是您可以将C#DLL放在服务中,例如WCF并以这种方式将功能公开给Java代码。使用ws…

从ASP.NET 1.1转换为ASP.Net 3.5后,单选按钮停止工作 - javascript

[我在下面以FYI的形式发布我们的问题和解决方案。如果您有Microsoft或代表机构对此问题的正式声明,我会将其标记为答案。否则,我下面的帖子将作为答案]。问题:我们采用了ASP.Net 1.1程序,并将其转换为ASP.Net 3.5。该页面最初正确显示,默认情况下选中一个单选按钮,并显示一个项目列表(“列表A”)。当我们单击另一个单选按钮时,它将正确显示…