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()
));