source1 發出 A、B、C、D 等并且永遠不會完成
source2 發出 1,2 并完成
我想合并到 A1、B2、C1、D2 等
更新
我最初學嘗試是Zip和Repeat從建議Theodor然而,這將創建一個鎖定的原因源2代是昂貴的。
來自Enigmativity解決該問題的最后評論
source1.Zip(source2.ToEnumerable().ToArray().Repeat())
uj5u.com熱心網友回復:
既然你想重復source2無限期地和你說,這是冷(在它產生的意義相同的一組值的每個時間,一般在同種節奏的),它是昂貴的,我們要轉IObservable<T>成T[]以確保它只計算一次。
var array = source2.ToEnumerable().ToArray();
var output = source1.Zip(array.Repeat(), (x, y) => (x, y));
uj5u.com熱心網友回復:
假設理想的大理石圖是這樣的:
Source1: --------A-------B-------C--------D-------|
Source2: ----1--------------2--------|
Merged: --------A1---------B2-------C1---D2------|
這是ZipWithRepeated具有此行為的運算子:
static IObservable<(TFirst First, TSecond Second)> ZipWithRepeated<TFirst, TSecond>(
this IObservable<TFirst> first, IObservable<TSecond> second)
{
return second.Replay(replayed => first.ToAsyncEnumerable()
.Zip(replayed.ToAsyncEnumerable().Repeat())
.ToObservable());
}
用法示例:
var merged = source1.ZipWithRepeated(source2);
此解決方案需要依賴System.Linq.Async和System.Interactive.Async包,因為這兩個序列IAsyncEnumerable<T>在壓縮之前都轉換為s。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/400012.html
