C# 当第一个可观察项中的一个项满足谓词时,如何合并可观察项?

C# 当第一个可观察项中的一个项满足谓词时,如何合并可观察项?,c#,system.reactive,C#,System.reactive,我想获取两个可观察对象,从第一个可观察对象开始发射,直到其中一个项遇到谓词,然后开始发射从这两个对象合并的事件,如下所示: letters: -A----B---C----d---------e-----f------g-- numbers: ---1-------2----------3-----4-----5------ predicate: IsLowerCase() result: -A----B---C----d12----3--e--4--f--5---

我想获取两个可观察对象,从第一个可观察对象开始发射,直到其中一个项遇到谓词,然后开始发射从这两个对象合并的事件,如下所示:

letters:     -A----B---C----d---------e-----f------g--
numbers:     ---1-------2----------3-----4-----5------
predicate:   IsLowerCase()
result:      -A----B---C----d12----3--e--4--f--5---g--
如何在C#中使用System.Reactive实现这一点


谢谢

开关
几乎总是关键:

var letters = new Subject<string>();
var numbers = new Subject<string>();
var predicate = lettersPublished.Select(s => s.All(c => char.IsLower(c)));

var numbersCached = numbers.Replay().RefCount();

var dummySubscription = numbersCached.Subscribe();

var combined = lettersPublished.Merge(numbersCached);

var switchFlag = predicate.Where(b => b).Take(1);

var result = switchFlag.StartWith(false).Select(b => b ? combined : letters).Switch();

var resultWithDisposal = Observable.Using(() => dummySubscription, _ => result);

开关是我所缺少的。谢谢
var oneLiner = letters.Publish(_letters => numbers.Replay(_numbers =>  
    _letters
        .Select(s => s.All(c => char.IsLower(c)))
        .Where(b => b)
        .Take(1)
        .StartWith(false)
        .Select(b => b ? _letters.Merge(_numbers) : letters)
        .Switch()
));