2011-11-14 13 views
6

में एक आरएक्स नमूदार एक स्थिति के आधार पर पूरा करने के लिए मैं एक घटना है कि मैं नियंत्रण जिनमें से मुझे डेटा के साथ प्रदान करता है में नहीं कर रहा हूँ है।कैसे एक घटना

class MyEventArg { 
    bool IsLastItem {get;} 
    Data DataItem {get;} 
} 

मैं आरएक्स का उपयोग एक IObservable को यह घटना कन्वर्ट करने के लिए: EventArgs कुछ इस तरह लग रहा है। लेकिन अगर IsLastItem सच है तो मैं अवलोकन योग्य को पूरा करना चाहता हूं।

कोई सुरुचिपूर्ण विचार? एक तरह से पाइप के लिए एक विषय मैं और अधिक नियंत्रण नहीं है कि अगर स्थिति उत्पन्न होती है OnComplete घटना सेट करने के लिए के माध्यम से डाटा होगा ...

उत्तर

9

आप पिछले तत्व चाहते हैं तो आप TakeWhile के साथ संयुक्त नियमित धारा के साथ एक साथ ही पिछले तत्व के साथ एक धारा विलय कर सकते हैं शामिल किया जाना है।

var subject = new List<string> 
{        
"test", 
"last" 
}.ToObservable(); 

var my = subject 
      .Where(x => x == "last").Take(1) 
      .Merge(subject.TakeWhile(x => x != "last")); 

my.Subscribe(
    o => Console.WriteLine("On Next: " + o), 
    () => Console.WriteLine("Completed")); 

Console.ReadLine(); 

यह प्रिंट: यहाँ यह साबित करने के लिए एक सरल सांत्वना अनुप्रयोग है

On Next: test 
On Next: last 
Completed 

अद्यतन एक बग कि OnCompleted संदेश दबा अगर अंतर्निहित प्रत्यक्ष वास्तव में पूर्ण नहीं हुआ था । मैं कोड OnCompleted सुनिश्चित करने के लिए

और तुम इस तरह कोड refactor कर सकते हैं यदि आप अंतर्निहित अनुक्रम की सदस्यता ठंड observables के लिए एक से अधिक बार से बचना चाहते हैं कहा जाता हो जाता है सही किया:

var my = subject.Publish(p => p 
      .Where(x => x == "last").Take(1) 
      .Merge(p.TakeWhile(x => x != "last"))); 
+0

अच्छा! यह देखने के लिए मुझे कुछ सेकंड लगाए कि यह कैसे किया जाता है। शायद बेहतर लिखना: subject.TakeWhile (x => x! = "Last")। मर्ज करें (विषय। जहां (x => x == "last")। (1) ले लो); ठंडे देखने योग्य टिप एक + है। धन्यवाद – lukebuehler

2

आप कुछ इस तरह के लिए देख रहे हैं?

IObservable<MyEventArg> result = 
    myEventArgObservable.TakeWhile(arg => !arg.IsLastItem); 
+0

वाह, यह होगा सरल और अच्छा। क्या आप जानते हैं कि क्या अवलोकन योग्य है यदि भविष्य सत्य है? – lukebuehler

+0

हाँ, यह OnCompleted() पर सूचित करेगा अगर आप इसे सूचित करने के लिए OnCompleted आप बस का उपयोग कर सकते नहीं करना चाहती कहाँ (आर्ग =>! Arg.IsLastItem) – Christoph

+1

हाँ, यह प्रत्यक्ष कम्प्लिट्स की तरह लगता है, लेकिन अब मैं समस्या है कि मुझे अंतिम वस्तु नहीं मिलेगी ... – lukebuehler

2
public static IObservable<TSource> TakeWhileInclusive<TSource>(
     this IObservable<TSource> source, Func<TSource, bool> predicate) 
{ 
    return Observable 
     .Create<TSource>(o => source.Subscribe(x => 
                { 
                 o.OnNext(x); 
                 if (!predicate(x)) 
                  o.OnCompleted(); 
                }, 
               o.OnError, 
               o.OnCompleted 
           )); 
} 
संबंधित मुद्दे