Chỉnh sửa: Vui lòng xem nhận xét của the_joric nếu bạn định sử dụng tính năng này. Có một trường hợp cạnh mà không được xử lý, tôi không thấy một cách nhanh chóng để sửa chữa nó, và vì vậy tôi không có thời gian để sửa chữa nó ngay bây giờ.
Đây là giải pháp trong C#, vì bạn có thẻ system.reactive
.
static IObservable<int> MergeSorted(IObservable<int> a, IObservable<int> b)
{
var source = Observable.Merge(
a.Select(x => Tuple.Create('a', x)),
b.Select(y => Tuple.Create('b', y)));
return source.Publish(o =>
{
var published_a = o.Where(t => t.Item1 == 'a').Select(t => t.Item2);
var published_b = o.Where(t => t.Item1 == 'b').Select(t => t.Item2);
return Observable.Merge(
published_a.Delay(x => published_b.FirstOrDefaultAsync(y => x <= y)),
published_b.Delay(y => published_a.FirstOrDefaultAsync(x => y <= x)));
});
}
Ý tưởng được tóm tắt như sau.
Khi a
phát ra giá trị x
, chúng ta trì hoãn nó cho đến khi b
phát ra một giá trị y
mà x <= y
.
Khi b
phát ra giá trị y
, chúng ta trì hoãn nó cho đến khi a
phát ra một giá trị x
mà y <= x
.
Nếu bạn chỉ có quan sát nóng, bạn có thể làm như sau. Nhưng sau đây sẽ không hoạt động nếu có bất kỳ quan sát lạnh trong hỗn hợp. Tôi sẽ khuyên bạn nên luôn sử dụng phiên bản hoạt động cho cả các quan sát nóng và lạnh.
static IObservable<int> MergeSortedHot(IObservable<int> a, IObservable<int> b)
{
return Observable.Merge(
a.Delay(x => b.FirstOrDefaultAsync(y => x <= y)),
b.Delay(y => a.FirstOrDefaultAsync(x => y <= x)));
}
Nguồn
2015-06-03 21:14:02
câu hỏi rất thú vị, tôi thích nó. :) –