मान लीजिए कि आप निम्नलिखित कोड डालें:एक Linq कथात्मक क्वेरी अभिव्यक्ति में एक लैम्ब्डा सम्मिलित करने के लिए कैसे
string encoded="9,8,5,4,9";
// Parse the encoded string into a collection of numbers
var nums=from string s in encoded.Split(',')
select int.Parse(s);
आसान है यही कारण है, लेकिन क्या अगर मैं चयन में करने के लिए एक लैम्ब्डा अभिव्यक्ति लागू करना चाहते हैं, लेकिन अभी भी इसे एक घोषणात्मक क्वेरी अभिव्यक्ति के रूप में रखें, दूसरे शब्दों में:
string encoded="9,8,5,4,9";
// Parse the encoded string into a collection of numbers
var nums=from string s in encoded.Split(',')
select (s => {/* do something more complex with s and return an int */});
यह निश्चित रूप से संकलित नहीं होता है। लेकिन, मैं इसे तरल वाक्यविन्यास में स्विच किए बिना वहां एक लैम्ब्डा कैसे प्राप्त कर सकता हूं।
अद्यतन: StriplingWarrior से मार्गदर्शन के लिए धन्यवाद, मैं एक जटिल लेकिन compilable समाधान है:
var result=from string s in test.Split(',')
select ((Func<int>)
(() => {string u="1"+s+"2"; return int.Parse(u);}))();
कुंजी का चयन में से प्रत्येक यात्रा के लिए लैम्ब्डा के मूल्यांकन के बाद एक Func<string,int>
को इस फिल्म में है (s)
के साथ। क्या कोई भी कुछ भी आसान के साथ आ सकता है (यानी, फनक के कलाकारों के मूल्यांकन के बाद या शायद कुछ कम वर्बोज़ जो प्रश्न अभिव्यक्ति वाक्यविन्यास को बनाए रखते हुए एक ही अंतिम परिणाम प्राप्त करता है)?
नोट: उपरोक्त लैम्ब्डा सामग्री प्रकृति में मामूली और अनुकरणीय है। कृपया इसे मत बदलें।
अद्यतन 2: हाँ, यह मैं हूँ, पागल माइक, वापस एक वैकल्पिक साथ (खूबसूरत?) इस का हल:
public static class Lambda
{
public static U Wrap<U>(Func<U> f)
{
return f();
}
}
...
// Then in some function, in some class, in a galaxy far far away:
// Look what we can do with no casts
var res=from string s in test.Split(',')
select Lambda.Wrap(() => {string u="1"+s+"2"; return int.Parse(u);});
मैं इस बदसूरत कास्ट और parenarrhea बिना समस्या का हल है। क्या Lambda की तरह कुछ है। जेड जेनेरिक विधि पहले से ही .NET 4.0 फ्रेमवर्क में मौजूद है, ताकि मुझे पहिया को फिर से शुरू करने की आवश्यकता न हो? इस चर्चा को अधिक परेशान नहीं करने के लिए, मैंने इस बिंदु को अपने प्रश्न में स्थानांतरित कर दिया है: Does this "Wrap" generic method exist in .NET 4.0।
select DoSomethingComplex(s)
आप तरीकों को पसंद नहीं करते हैं, तो आप इस्तेमाल कर सकते हैं एक समारोह:
मुझे समझ नहीं आता क्यों क्या कभी किसी ने कथात्मक वाक्यविन्यास का उपयोग करना चाहते हैं। एसक्यूएल के साथ इसकी समानता नए आने वालों को लिनक्स में भ्रमित करने लगती है, इससे उन्हें यह समझने में मदद मिलती है कि लिनक क्या है। लेकिन वैसे भी अच्छा सवाल है। +1 –
@klausbyskov, SO पर "क्यों" के बारे में कई सवाल हैं जिनका उत्तर दिया गया है। मैं इस सवाल में क्यों संबोधित करने से कम चिंतित हूं और यदि संभव हो तो "कैसे" का जवाब देना चाहता हूं। माना जाता है कि मेरा उदाहरण धाराप्रवाह वाक्यविन्यास के लिए सबसे अच्छा उम्मीदवार नहीं है, लेकिन मैं एक साधारण उदाहरण का उपयोग करना चाहता था ताकि मेरे प्रश्न को खत्म न किया जा सके। –
घोषणात्मक वाक्यविन्यास आसान है जब आपके पास एकाधिक 'जॉइन' या 'से' होता है, जो अन्यथा कुछ गन्दा हाथ-कोडित अनाम प्रकारों की आवश्यकता होती है। – StriplingWarrior