這工作得很好:
var query =
a.Publish(pa =>
b.Publish(pb =>
c.StartWith("c")
.Select((x, n) => n % 2 == 0 ? pa : pb)
.Switch()));
我測試使用此代碼:
var xs = new []
{
"a1", "b1", "b2", "c", "b3",
"a2", "b4", "a3", "c", "a4",
"c", "a5", "b5", "a6", "b6",
"c", "a7", "b7",
}
.ToObservable()
.Publish();
var a = xs.Where(x => x.StartsWith("a"));
var b = xs.Where(x => x.StartsWith("b"));
var c = xs.Where(x => x.StartsWith("c"));
var query = ...
query.Subscribe(Console.WriteLine);
xs.Connect();
我懂了結果:
a1
b3
b4
a4
b5
b6
a7
的xs.Connect()
是使xs
觀察的工作作爲一種簡單的方法來產生三個序列纔有必要。
即使作爲擴展方法:
public static IObservable<TSource> Alternate<TSource>(
this IObservable<TSource> leftSelector,
bool startLeft,
IObservable<TSource> left,
IObservable<TSource> right)
{
return
left.Publish(pl =>
right.Publish(pr =>
leftSelector.StartWith(default(TSource))
.Select((x, n) => (n % 2 == (startLeft ? 0 : 1)) ? pl : pr)
.Switch()));
}
很整齊+1。我在我的回答中對此進行了很少的編輯,以允許「選擇器」不具有交替值的可能性(儘管此處也可以使用「DiscreteUntilChanged」)。 –