संपादित करें: यदि आप इसका उपयोग करने जा रहे हैं तो कृपया _joric की टिप्पणी देखें। एक एज केस है जिसे संभाला नहीं जाता है, मुझे इसे ठीक करने का एक त्वरित तरीका नहीं दिख रहा है, और इसलिए मेरे पास अभी इसे ठीक करने का समय नहीं है।
यहां सी # में एक समाधान है, क्योंकि आपके पास 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)));
});
}
विचार निम्नानुसार संक्षेप में है।
a
मूल्य x
का उत्सर्जन करता है, तो हम उसे देरी जब तक b
एक मूल्य y
ऐसी है कि x <= y
उत्सर्जन करता है।
b
मूल्य y
का उत्सर्जन करता है, तो हम उसे देरी जब तक a
एक मूल्य x
ऐसी है कि y <= x
उत्सर्जन करता है।
यदि आपके पास केवल गर्म अवलोकन हैं, तो आप निम्न कार्य कर सकते हैं। लेकिन मिश्रण में कोई ठंडा अवलोकन करने पर निम्नलिखित काम नहीं करेंगे। मैं हमेशा उस संस्करण का उपयोग करने की सलाह दूंगा जो गर्म और ठंडे अवलोकन दोनों के लिए काम करता है।
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)));
}
स्रोत
2015-06-03 21:14:02
बहुत दिलचस्प सवाल है, मुझे यह पसंद है देख सकते हैं। :) –