2015-08-21 29 views
2

中的最新更新序列我想知道是否有一個現有的操作符或某種邏輯可以讓我重現具有2個源序列的CombineLatest的行爲,但是增加了確定最後修改了2個序列中的哪一個。反過來,我想用這個區別來改變我在合併兩個序列的最新結果時的操作方式。確定並操作CombineLatest

我認爲表達我想要的一種好方法是給出一個方法簽名的例子來實現我所說的邏輯。

public static IObservable<TResult> MyOperator<TInLeft, TInRight, TResult>(
    this IObservable<TInLeft> left, 
    this IObservable<TInRight> right, 
    Func<TInLeft, TInRight, bool, TResult> selector) 
{ 
    // ...magic 
} 

在這種情況下,leftright將是條目序列和selector FUNC傳遞給該方法將具有其布爾參數值設置爲true,以指示它是left序列是的源最近的更改和false如果它是最後更改的right序列。

當然,爲了清楚起見,該方法也可以通過以下方式重新

public IObservable<TResult> MyOperator<TInLeft, TInRight, TResult>(
    this IObservable<TInLeft> left, 
    this IObservable<TInRight> right, 
    Func<TInLeft, TInRight, TResult> whenLeft, 
    Func<TInLeft, TInRight, TResult> whenRight) 
{ 
    // ... more magic 
} 

哪裏,而不是使用一個布爾值來區分最近更新的序列,每個序列會有它以func的形式擁有自己的行爲。

用例這樣的操作將是我想有一個共同的結果是依賴於leftright序列(就像CombineLatest)的組合,但優先考慮哪個有最新的信息。我希望我的意圖清楚明白。

是否有一個現有的運算符具有類似的基礎邏輯或可以適應此目的?我怎麼能夠完成這樣的行爲呢?我對某些可能有用的運營商有一個模糊的想法,但似乎可能有很多不同的方式,我只是不確定實現我想要的最佳方法。

回答

2

您可以嘗試將Timestamp運算符與CombineLatest結合使用。事情是這樣的:

var obs1 = Observable.Interval(TimeSpan.FromSeconds(1)).Timestamp(); 
    var obs2 = Observable.Interval(TimeSpan.FromSeconds(2)).Timestamp(); 

    var result = Observable.CombineLatest(obs1, obs2, (v1, v2) => 
    { 
     if(v1.Timestamp < v2.Timestamp) 
     { 
      Console.WriteLine("v1 " + v1.Timestamp); 
      return v1; 
     } 
     else 
     { 
      Console.WriteLine("v2 " + v1.Timestamp); 
      return v2; 
     }  
    }); 

    result.Subscribe(x => Console.WriteLine(x)); 
+0

好工作。你擊敗了我。只是一個小小的評論 - 你的比較運算符是錯誤的 - 它應該是'<'。 – Enigmativity

+0

感謝您的提示,現在修復。真的很享受你的帖子。 –

+0

謝謝。你真的嗎?你喜歡他們什麼? – Enigmativity

3

這裏是我會做什麼:

var combined = 
    source1.Timestamp() 
     .CombineLatest(source2.Timestamp(), (ts1, ts2) => new { ts1, ts2 }); 

combined.Select(x => 
    x.ts1.Timestamp < x.ts2.Timestamp 
     ? "source1 first" 
     : "source2 first"); 
+0

謝謝你們兩位。這就是我喜歡Rx的原因之一:你永遠不會停止學習。另一個說明,你是否遇到過這個用例? –

+0

@PhilGref - 我必須說我從未打過這個特殊用例。 – Enigmativity