2012-01-04 12 views
9

प्रतिक्रियाशील एक्सटेंशन के पुराने संस्करणों में IENumerable के लिए रन और डू एक्सटेंशन विधि दोनों थी। वे दोनों एक ही चीज कर रहे हैं, और मुझे अंतर की अनिश्चितता है।आरएक्स में रन एंड डू के बीच क्या अंतर है?

मैं पूछ रहा हूं क्योंकि मैं कुछ पुराने कोड को अपग्रेड कर रहा हूं, और डॉक्स को आईएक्स में ले जाया गया है (जो अभी तक एक स्थिर रिलीज पर नहीं है), और ऐसा लगता है कि रन को फॉरएच द्वारा प्रतिस्थापित किया गया है।

+0

जोनाथन, क्या कोई उत्तर आपकी मदद करता है? यदि ऐसा है, तो कृपया उत्तर के रूप में चिह्नित करें। धन्यवाद! –

+1

किसी के लिए सोचने के लिए, नए आरएक्स बिल्ड में "रन" के बराबर Observable.Wait() एक्सटेंशन विधि है। यह विधि अवलोकन स्रोत से प्राप्त अंतिम मूल्य, या अपवाद तक निष्पादन को अवरुद्ध करता है। इसे आमंत्रित करने से सब्सक्रिप्शन होने का कारण बनता है। – thefellow3j

उत्तर

10

निर्दिष्ट करता है कि निष्पादित होने पर कुछ दुष्प्रभाव होंगे, और साइड इफेक्ट्स के साथ अनुक्रम लौटाएंगे।

रन अनुक्रम को दर्शाता है, और शून्य लौटाता है।

इस तरह से सोचें: साइड इफेक्ट्स के साथ अनुक्रम "टैग" करें। उन दुष्प्रभाव केवल तभी होंगे जब अनुक्रम की गणना की जाएगी। साइड इफेक्ट्स के साथ नया अनुक्रम देता है।

// Example of .Do 
var elements = new[] { 1, 2, 3 }; 
var elementsWithSideEffects = elements.Do(e => MessageBox.Show(e)); // No Message Boxes shown yet! 
elementsWithSideEffects.Run(); // 3 message boxes shown 

रन, दूसरे हाथ पर, अनुक्रम विश्लेषण करता रन(), या वैकल्पिक रूप से साइड इफेक्ट देता है, तो अनुक्रम विश्लेषण करता रन (कार्रवाई)

// Example of .Run with its own side effects: 
var elements = new[] { 1, 2, 3 }; 
elements.Run(e => MessageBox.Show(e)); // 3 Message Boxes shown. 
+2

मुझे लगता है कि आपको अपनी सरणी घोषणाओं के बाद 'AsObservable()' की आवश्यकता है (अन्यथा यह 'IENumerable' पर चल रहा है)। –

+0

एआरएम, अगर मुझे गलत नहीं है, तो डॉन और .र इंटरएक्टिव एक्सटेंशंस (आईएक्स) का हिस्सा हैं, जो आईनेमेरेबल पर संचालित होता है। –

+0

'Do' अभी भी IENumerable और IObservable दोनों पर है। 'रन' * WP7 रिलीज टाइमफ्रेम दोनों के रूप में * था, लेकिन अब केवल आईएक्स के हिस्से के रूप में उपलब्ध है। ऐसा कहकर, अब मुझे एहसास हुआ कि ओपी वास्तव में आईन्यूमेरेबल का जिक्र कर रहा था, न कि IObservable। भ्रम के लिए माफ़ी। –

8

आप के रूप Do सोच सकते हैं "पीक" क्योंकि यह प्रत्येक मान/त्रुटि/समापन के लिए दुष्प्रभाव निष्पादित करता है लेकिन लैम्बडास सभी रिटर्न शून्य से गुजरने के बाद से उनके मूल्यों को नहीं बदल सकता है। यह Subscribe जैसा है, लेकिन यह मोनैड ("चेन") को तोड़ता नहीं है क्योंकि यह IObservable<T> देता है। Do अक्सर लॉगिंग के लिए उपयोग किया जाता है।

Run मूल रूप से Subscribe का एक अवरुद्ध संस्करण है, जिसका अर्थ है कि निष्पादन उस लाइन से पहले जारी नहीं रहता है जब तक ऑनकंपलेट/ऑनरर नहीं कहा जाता है।

+0

शानदार जवाब, इसने मेरे लिए पैसा गिरा दिया। – Contango

6

एक एएमपी मीटर के रूप में सोचने के बारे में सोचें: आपने सर्किट (क्वेरी ऑपरेटर की श्रृंखला) को खोल दिया है और वर्तमान के लिए एक मीटर (एक एक्शन प्रतिनिधि) तार (क्वेरी ऑपरेटर के माध्यम से बहने वाले मान) को तारित किया है। सर्किट (क्वेरी) के माध्यम से बहने वाले प्रत्येक इलेक्ट्रॉन (मूल्य) के लिए, मीटर (क्रिया) कुछ काम करता है। नोटिस सर्किट (क्वेरी) अभी भी बंद है (आलसी)। यह तब तक नहीं है जब तक आप बैटरी में प्लग न करें (फ़ोरैच लूप चलाएं) कि वर्तमान (मान) बह रहे हैं। सर्किट को चालू करने का एक आसान तरीका (क्वेरी चलाएं) बैटरी (फॉरएच ऑपरेटर) का उपयोग करना है।

+0

मुझे आपके समानता पसंद है लेकिन ForEach एक भार है, बैटरी नहीं:) सर्किट खुला होने तक, कुछ भी नहीं होता है। –

3

अन्य LINQ ऑपरेटरों जैसे चयन या कहां जैसे कार्य करता है - कुछ भी नहीं होता है यदि आप इसका उपयोग करते हैं, तो आपको कुछ होने के लिए foreach मिलना होगा। foreach कथन की तरह कार्य करें/सदस्यता लें/सदस्यता लें, यह तुरंत निष्पादित हो जाता है।

यदि आप प्रत्येक का उपयोग करने के लिए 100% स्पष्ट नहीं हैं, तो करें और केवल ForEach/Run का उपयोग करें।

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