हां, yield return
निरंतरता का एक रूप है। यद्यपि कई उपयोगी मामलों के लिए, लिंकक कार्यात्मक ऑपरेटरों को प्रदान करता है जो आपको आलसी अनुक्रम जनरेटर को एक साथ प्लग करने की अनुमति देता है, इसलिए वास्तव में सी # 3 में yield return
का उपयोग करना आवश्यक नहीं है (जब आप अपने स्वयं के अधिक लिंक-शैली एक्सटेंशन जोड़ना चाहते हैं पुस्तकालय में प्लग अंतराल, उदाहरण के लिए ज़िप, अनफोल्ड)।
उदाहरण में हम ब्रूट फोर्स द्वारा एक पूर्णांक को कारगर बनाते हैं।
var factors = Enumerable.Range(2, 100)
.Join(Enumerable.Range(2, 100),
n => 1, n => 1, (i, j) => new { i, j })
.First(v => v.i*v.j == 481);
Console.WriteLine("Factors are " + factors.i + ", " + factors.j);
यहाँ शुरुआती बिंदु है जो Linq करने के लिए निर्मित Enumerable.Range
करने के लिए अपने दो कॉल, हैं, लेकिन आप अपने आप को के रूप में लागू कर सकता है:
अनिवार्य रूप से सी # में एक ही उदाहरण के साथ निर्मित Linq ऑपरेटरों किया जा सकता है
IEnumerable<int> Range(int start, int stop)
{
for (int n = start; n < stop; n++)
yield return n;
}
दो अजीब पैरामीटर, n => 1
, Join
को n => 1
मानकों हैं। मैं आइटम्स मिलान करते समय उपयोग करने के लिए Join
के लिए महत्वपूर्ण मान के रूप में 1 चुन रहा हूं, इसलिए सभी संयोजन मेल खाते हैं और इसलिए मुझे श्रेणियों से संख्याओं के प्रत्येक संयोजन का परीक्षण करना पड़ता है।
तो मैं एक साथ टपल की तरह (एक गुमनाम प्रकार) में मूल्यों की जोड़ी बारी:
.First(v => v.i*v.j == 481);
:
(i, j) => new { i, j })
अंत में, मैं इस तरह की पहली टपल जिसके लिए अपने परीक्षण संतुष्ट हो जाता है लेने
अद्यतन
कॉल के अंदर कोड First
को केवल एक छोटी परीक्षण अभिव्यक्ति होने की जरूरत नहीं।
.First(v =>
{
Console.WriteLine("Aren't lambdas powerful things?");
return v.i*v.j == 481;
);
तो प्रोग्राम है जो संभावित रूप से विभिन्न मूल्यों के साथ पुनः प्रारंभ करना होगा की बात यह है कि लैम्ब्डा में चला जाता है: यह जो करने के लिए "को पुन: प्रारंभ" किया है, तो परीक्षण में विफल रहता है की जरूरत है जरूरी कोड की एक पूरी बहुत कुछ हो सकता है। जब भी वह लैम्ब्डा अलग-अलग मूल्यों के साथ खुद को पुनरारंभ करना चाहता है, तो यह केवल झूठी वापसी करता है - amb
को बिना किसी तर्क के कॉल करने के बराबर।
अच्छा कोड - लेकिन यह AMB की तुलना में एक काफी अलग प्रभाव पड़ता है। अंब अपने मूल्य का चयन करता है जैसे कि पूरा कोड विफल नहीं होता है, न कि केवल निम्नलिखित गणना। – Dario
"पुनरारंभ" को किसी विशेष संदर्भ तक सीमित होना चाहिए, हालांकि इसे लागू किया गया है; विशेष रूप से, पूरे कार्यक्रम को पुनरारंभ करने के लिए मूर्खतापूर्ण होगा, जिसमें एंब वैरिएबल पेश किए जाने से पहले किए गए सभी कार्यों सहित! मेरे संस्करण में, यह एंब वैरिएबल को अनुक्रम में चैनल करके स्पष्ट कर दिया गया है, और फिर पुनरारंभ करने योग्य संदर्भ लैम्ब्डा को पहले पास किया गया है - ऊपर दिए गए अद्यतन को देखें जो यह स्पष्ट कर सकता है। लैम्ब्डा में कोड मनमाने ढंग से जटिल हो सकता है। –
सहमत, अच्छा कोड, लेकिन यह एक निर्धारक क्रूर बल कार्यान्वयन है। यह एक समवर्ती गैर-निर्धारिक कार्यान्वयन नहीं है, जो मुझे लगता है कि एएमबी ऑपरेटर को लागू करने के प्रमुख गुणों में से दो हैं। एक साइड नोट के रूप में, इस पोस्ट के बाद, आरएक्स जारी किया गया था और इसमें एक अंबा ऑपरेटर है। –