2011-09-12 10 views
81

मुझे पता है कि इस Linq है:क्या यह लिंक या लैम्ब्डा है?

var _Results = from item in _List 
       where item.Value == 1 
       select item; 

और मुझे पता है यह लैम्ब्डा है:

var _Results = _List.Where(x => x.Value == 1); 

संपादक की टिप्पणी: ऊपर केवल लैम्ब्डा नहीं है, यह LINQ का उपयोग कर "है विधि सिंटेक्स "जिसका भविष्य लैम्ब्डा है। स्पष्ट होने के लिए, उपर्युक्त नमूने दोनों लिंकक हैं (मेरी मूल पोस्ट गलत थी, लेकिन मैंने प्रश्न को हल करने के भ्रम को दर्शाने के लिए त्रुटि त्रुटि छोड़ी)।

लेकिन क्या लैंकडा का एक उप-समूह है या क्या?

दो समान रूप से समान तकनीक क्यों हैं?

क्या एक दूसरे को चुनने का कोई तकनीकी कारण है?

+2

सुधार: http://www.lambdaexpression.net/ –

उत्तर

112

यह LINQ (क्वेरी सिंटैक्स का उपयोग) है:

var _Results = from item in _List 
       where item.Value == 1 
       select item; 

यह भी LINQ (विधि सिंटैक्स का उपयोग) है:

var _Results = _List.Where(x => x.Value == 1); 

यह ध्यान रखें कि both of these flavors ठीक उसी उत्पादन खत्म हो जाएगा दिलचस्प है कोड। कंपाइलर आपको अपनी इच्छानुसार अपनी इच्छाओं को व्यक्त करने की अनुमति देकर एक सेवा प्रदान करता है।

x => x.Value == 1 

आप विधि वाक्य विन्यास का उपयोग करना चुनते हैं, LINQ लगभग हमेशा लैम्ब्डा भाव के आसपास देखा जाता है:

और इस एक लैम्ब्डा है। लेकिन LINQ और lambdas दो पूरी तरह से अलग चीजें हैं, जिनमें से दोनों स्वयं द्वारा उपयोग किए जा सकते हैं।

अद्यतन: रूप svick ठीक ही बताते हैं, क्वेरी सिंटैक्स के साथ LINQ भी लैम्ब्डा अभिव्यक्ति का उपयोग करते कार्यान्वित (जैसा कि पहले उल्लेख के रूप में, संकलक आप क्वेरी सिंटैक्स में लिखने की अनुमति देता है, लेकिन प्रभावी ढंग से अपनी पीठ के पीछे विधि वाक्य रचना करने के लिए इसे बदल देती है)। यह सिर्फ इस तथ्य पर पिलिंग कर रहा है कि दोनों स्वाद पूरी तरह से समकक्ष हैं और वैसे ही व्यवहार करेंगे (उदाहरण के लिए लैम्ब्डा अभिव्यक्ति closures बनने का कारण बन सकती है)।

+2

मुझे लगता है कि यह उल्लेखनीय है कि क्वेरी सिंटैक्स दृश्यों के पीछे भी लैम्बडा का उपयोग करता है। बंद होने की वजह से यह महत्वपूर्ण हो सकता है। – svick

+0

@svick: दरअसल, उत्तर अपडेट किया गया। एमएसडीएन सिफारिश के लिए – Jon

30

दोनों लिंक हैं। दूसरा Lambdas का उपयोग कर रहा है।

लैम्बडास इनलाइन विधि प्रकार की चीजें हैं जिन्हें आप दूसरे उदाहरण में फ़ंक्शन के पैरामीटर के रूप में पास कर रहे हैं।

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

यह एमएसडीएन लेख भी ब्याज का हो सकता है: LINQ Query Syntax versus Method Syntax। विशेष प्रासंगिकता में है: "आम तौर पर, हम क्वेरी सिंटैक्स की अनुशंसा करते हैं क्योंकि यह आमतौर पर सरल और अधिक पठनीय होता है, हालांकि विधि सिंटैक्स और क्वेरी सिंटैक्स के बीच कोई अर्थपूर्ण अंतर नहीं होता है।"

+1

+1। –

+4

व्यक्तिगत रूप से, मुझे विधि वाक्यविन्यास अधिक पठनीय लगता है - शायद क्योंकि मेरा अधिकांश कोड "LINQ से ऑब्जेक्ट्स" विविधता का है। लेकिन अगर आपके पास बहुत सारे SQL अनुभव हैं, तो शायद पहले सिंटैक्स को समझना आसान होगा। –

+0

@ टॉम बुशेल, यहां तक ​​कि वाक्यविन्यास में शामिल हों? गंभीरता से? –

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