我想创建一个观察对象,当右侧观察对象发出一个值时,该观察对象会发出一个值,并随之带走最后一个左侧观察对象值,即,如以下大理石图表所述(摘自combining-sequences)

enter image description here

阅读上面链接中的文档表明,这可以通过确保不相交的左持续时间 Select 器和立即返回的右持续时间 Select 器来实现.所以我try 了这个:

leftObservable.Join(rightObservable, _ => leftObservable.Publish().RefCount(), _ => Observable.Empty<Unit>(), (l,r) => (l,r))

但它似乎没有发出任何东西.我做错了什么?

Update

我认为这可能归因于加入声明中的可观察性,即,它们起源于switch,例如,

var left1 = Observable.Interval(TimeSpan.FromSeconds(5));
var left2 = Observable.Interval(TimeSpan.FromSeconds(7));

var left = left1.Select(x => left2).Switch();
var right = Observable.Interval(TimeSpan.FromSeconds(1));

var test = left.Join(right, _ => left.Publish().RefCount(), _ => Observable.Empty<Unit>(), (l, r) => (l, r))
    .Distinct(x => x.r)
    .Subscribe(x =>
    {
        Debug.WriteLine($"left: {x.l}, right: {x.r}");
    });

如果我在join声明中用left替换left,事情就会按照预期进行.所以我一定误解了switch在这种情况下的运作方式?

推荐答案

    static async Task Main()
    {

        var left = Observable.Interval(TimeSpan.FromSeconds(0.3));
        var right = Observable.Timer(TimeSpan.FromSeconds(1),TimeSpan.FromSeconds(1)).Select(i => (char)('A'+i)).Take(5);

        right.WithLatestFrom(left).Subscribe(i => Console.WriteLine(i));

        Console.ReadLine();
    }

给出输出:

(A, 2)
(B, 5)
(C, 8)
(D, 12)
(E, 15)

看起来像您所期待的吗?

Csharp相关问答推荐

.NET最小API映射将T参数列表为[FromQuery]

当打印一行x个项目时,如何打印最后一行项目?

如何在C#中删除一个特殊字符,如"使用Regex"

在C#中,DirectoryEntry返回空AuditRules集合,即使审计规则确实存在

如何删除文件的基础上嵌入的时间戳嵌入文件名

HttpConext.Request.Path和HttpConext.GetEndpoint()之间的差异

如何在WPF的树视图中显示一个对象的两个或多个属性,其中只有一个是分层项?

为什么Regex.IsMatch(";\\t";,";\\t";)返回FALSE而不是TRUE?

如何在毛伊岛应用程序中完美地同步视图模型和视图的加载?

为什么无法将对象转换为泛型类型

CS1660无法将lambda表达式转换为类型INavigationBase,因为它不是委托类型

有空容错运算符的对立面吗?

如何将端点(或с匹配请求并判断其路径)添加到BCL?

Regex字母数字校验

如何从另一个类的列表中按ID取值

在C#ASP.NET内核中使用INT AS-1进行控制器场景的单元测试

如何正确地在VB中初始化类?

为什么我的属性即使没有显式地设置任何[必需]属性,也会显示验证?

与Visual Studio 2022中的.NET框架相比,如何在.NET Core 6中获取错误输出的窗口句柄

MS Project读取项目自定义域