2017-05-12 37 views
0

我想取兩個觀測,並從第一個觀察的發射,直到項目之一滿足謂詞,然後開始發射事件從兩者合併,就像這樣:一旦第一個observable中的某個項目滿足謂詞,我該如何合併observables?

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?

感謝

回答

1

Switch幾乎總是關鍵:

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

建設兩個觀測,一個前謂詞是真實的(letters你的情況),以及一(combined),然後使用他們之間可以觀察到切換(switchflag)。需要dummySubscription才能讓Replay在後一訂閱之前緩存所有值。 Using用於轉儲dummySubscription

你也可以做到這一切在一個單一的表達式(給出lettersnumbers)如下:

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

交換機是我錯過了什麼。謝謝! – user37078

相關問題