2014-05-02 11 views
9

में लाइव डेटा स्ट्रीम को वैकल्पिक रूप से बफर और प्रवाह कैसे कर सकता हूं मेरे पास दो स्ट्रीम हैं। एक डेटा का प्रवाह है (किसी भी प्रकार का हो सकता है), दूसरा एक बूलियन स्ट्रीम गेट के रूप में कार्य कर रहा है। मैं एक धारा निम्नलिखित व्यवहार है कि में इन गठबंधन करने के लिए की जरूरत है:मैं आरएक्स

  • जब फाटक खुला है (सबसे हाल मूल्य सच था) तो डेटा
  • के माध्यम से सीधे प्रवाह चाहिए जब गेट बंद कर दिया है (सबसे हाल ही में मूल्य झूठा था) तो डेटा बफ़र किया जाना चाहिए अलग-अलग तत्वों के रूप में जारी किया जाएगा जब गेट अगले खुला
  • समाधान डेटा के सभी तत्वों को बनाए रखने और बनाए रखने चाहिए आदेश

मुझे सच में यकीन नहीं है कि इसे एक साथ कैसे रखा जाए। आदानों मैं के साथ परीक्षण किया गया है इस तरह हैं:

// a demo data stream that emits every second 
var dataStream = Observable.Interval(TimeSpan.FromSeconds(1)); 

// a demo flag stream that toggles every 5 seconds 
var toggle = false; 
var gateStream = Observable.Interval(TimeSpan.FromSeconds(5)) 
    .Select(_ => toggle = !toggle); 

उत्तर

15

मैं यह कर देंगी:

  • विंडो बंद होने वाले चयनकर्ता के रूप में गेट धारा का उपयोग कर डेटा स्ट्रीम
  • हम DistinctUntilChanged उपयोग कर सकते हैं द्वार धारा पर
  • हम गेट स्ट्रीम को बंद (झूठी) शुरू करने के लिए भी मजबूर करेंगे - यह आउटपुट को प्रभावित नहीं करेगा और एक साफ चाल
  • टी मुर्गी Select के अधिभार का उपयोग करें जो प्रत्येक तत्व को इंडेक्स नंबर देता है। इसके साथ हम बता सकते हैं कि हमें खिड़की को बफर करने या निकालने की आवश्यकता है, क्योंकि हम जानते हैं कि यहां तक ​​कि क्रमांकित खिड़कियां बफरिंग के लिए हैं (क्योंकि हमने सुनिश्चित किया है कि गेट स्ट्रीम झूठी से शुरू होती है)
  • हम ToList() का उपयोग बफर में कर सकते हैं प्रत्येक भी खिड़की जब तक यह बंद कर देता है - यह वास्तव में एक Buffer() इंतजार कर रहा है कि OnCompleted तक
  • हम एक पहचान SelectMany का उपयोग आदेश आदेश की गारंटी के लिए बफ़र खिड़कियों
  • अंत में हम खिड़कियों को श्रेणीबद्ध समतल के बराबर संरक्षित है

ऐसा लगता है:

dataStream.Window(gateStream.StartWith(false).DistinctUntilChanged()) 
      .Select((w, i) => i % 2 == 0 ? w.ToList().SelectMany(x => x) : w) 
      .Concat() 
      .Subscribe(Console.WriteLine); 
+2

बहुत चालाक विधि – Brandon

+2

कूलस्ट आरएक्स मैंने लंबे समय से देखा है। –

संबंधित मुद्दे