यह Linq या लैम्ब्डा है?


105

मुझे पता है कि यह लिनक है:

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

और मुझे पता है कि यह लंबोदर है:

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

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

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

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

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


जवाबों:


135

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

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

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

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

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

और यह एक मेमना है:

x => x.Value == 1

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

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


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

34

दोनों लिनक हैं। दूसरा एक मेम्ने का उपयोग कर रहा है

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

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

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


6
व्यक्तिगत रूप से, मुझे विधि वाक्यविन्यास अधिक पठनीय लगता है - शायद इसलिए कि मेरा अधिकांश कोड "LINQ to Objects" किस्म का है। लेकिन अगर आपके पास बहुत अधिक एसक्यूएल अनुभव है, तो शायद क्वेरी सिंटैक्स को पहली बार में समझना आसान होगा।
टॉम बुशेल

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

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

@ जेरी - क्रिस की तरह, मेरा LINQ काम अब तक काफी सरल रहा है। मैंने पढ़ा है कि SelectMany, Join, या GroupJoin करते समय क्वेरी सिंटैक्स आमतौर पर बेहतर होता है - मुझे अभी ऐसा कुछ करने की ज़रूरत नहीं है - फिर भी!
टॉम बुशेल

1
आंतरिक रूप से "क्वेरी सिंटैक्स" को LINQ पर SQL और LINQ को एंटिटी टीमों को "कॉम्प्रिहेंशन सिंटैक्स" के रूप में संदर्भित किया गया था।
दमिंज १५'१४ को
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.