2010-02-10 17 views
5

यहाँ दो सी # वर्गों ...यह LINQ क्वेरी क्या करती है?

public class Address 
{ 
    public string Country; 
    public string City; 
} 

public class Traveller 
{  
    public string Name; 
    public List<Address> TravelRoute; 
} 

... और डेटा (कहीं भरा) की एक सूची ...

List<Traveller> Travellers; 

... और फिर इस LINQ क्वेरी हैं:

var result = from t in Travellers 
      where t.TravelRoute.Any(a => a.Country == "F") 
      select t; 

foreach (var t in result) 
    System.Console.WriteLine(t.Name); 

मुझे क्वेरी समझ में नहीं आ रहा है: "कोई भी" फ़ंक्शन और "=>" ऑपरेटर क्या करता है?

क्या कोई मुझे बता सकता है कि इस कोड में क्या चल रहा है? धन्यवाद!

उत्तर

1

लाइन

 
a => a.Country == "F" 

कुछ इस तरह करने के लिए अनुवाद होगा अगर यह एक अलग LINQ बयान था करने के लिए: कोई। दूसरे शब्दों में, यह सच वापस आ जाएगी अगर Travelroute में वस्तुओं के किसी भी अपने देश संपत्ति है करने के लिए 'एफ'

आशा है कि

+0

तो, क्या इसका मतलब यह है कि यह "लैम्ब्डा अभिव्यक्ति" केवल "नेस्टेड" LINQ क्वेरी के लिए संक्षेप है? केवल कोड लिखने के लिए कुछ और कॉम्पैक्ट? – Slauma

+0

लैम्ब्डा अभिव्यक्ति, इनलाइन अभिव्यक्ति के रूप में भी जाना जाता है, आमतौर पर एक बार के फ़ंक्शन के लिए लिखा जाता है और आमतौर पर अधिक कॉम्पैक्ट होता है। आपको तर्क के लिए एक प्रकार निर्दिष्ट करने की आवश्यकता नहीं है क्योंकि यह इसे कम करेगा। मैंने कहा हाँ, आप इसे एक नेस्टेड LINQ के साथ प्रतिस्थापित कर सकते हैं, लेकिन मुझे यह नहीं कहना है कि LINQ लिखने के लिए मैं एक और LINQ में लिखा था, उसी तरह काम करेगा। –

+0

अधिक सटीक होने के लिए, लैम्ब्डा अभिव्यक्ति एक अभिव्यक्ति वृक्ष में भी अनुवाद कर सकती है जिसका उपयोग LINQ प्रदाता द्वारा SQL कोड की तरह कोड के किसी अन्य भाग में अनुवाद करने के लिए किया जाता है। –

7

यह उन सभी यात्रियों का चयन करता है जिनके ट्रैवल रूट में एक देश है जो "एफ" है।

Any फ़ंक्शन सत्य में लौटते हैं यदि सूची में से किसी भी वस्तु फ़ंक्शन में पास की गई स्थिति को पूरा करती है। विधि हस्ताक्षर से, आप देख सकते हैं कि यह Func<> प्रतिनिधि है जो bool देता है। इसका मतलब है कि यह किसी भी विधि को लेता है जो एक बूलियन लौटाएगा, जिसमें लैम्ब्डा अभिव्यक्ति भी शामिल है।

यह => एक lambda expression जो शर्त यह है कि में पारित हो जाता है के अनुसार फिल्टर करेगा Where से अलग है,।

। इस विशेष मामले में, यह anonymous delegate लिखने का शॉर्टकट है।

+3

में मदद करता है यह शायद उनका कहना है कि 'Any' एक समकक्ष से' All' है लायक है ; 'ऑल' सही होता है जब संग्रह के हर * तत्व की स्थिति (अनिवार्य रूप से 'और' कथन की लंबी स्ट्रिंग) और विफलता पर 'झूठी' के लिए शॉर्ट-सर्किट को संतुष्ट करती है, जबकि 'कोई भी * सत्य * जब * कोई * तत्व संग्रह की शर्त (अनिवार्य रूप से 'या' कथन की लंबी स्ट्रिंग) और पास पर 'सत्य' के लिए शॉर्ट सर्किट को संतुष्ट करती है। –

+0

मुझे नहीं लगता कि यह सही ढंग से व्यक्त किया गया है।'कहां' कीवर्ड किसी भी ऑब्जेक्ट का चयन करता है जो इस शर्त को पूरा करता है, इस स्थिति में स्थिति यह है कि कम से कम एक ट्रैवल रूट होना चाहिए जिसके लिए भविष्यवाणी सही होती है। मुझे लगता है कि अंतर को ध्यान में रखना महत्वपूर्ण है। –

+0

धन्यवाद एडम, "कोई भी" का यह स्पष्टीकरण काफी स्पष्ट था! – Slauma

0

यह एक लैम्ब्डा अभिव्यक्ति है। http://msdn.microsoft.com/en-us/library/bb397687.aspx ऐसा लगता है कि यह उन सभी यात्रियों का चयन कर रहा है, जिनमें कोई भी "एफ" में यात्रा मार्ग है, जो संभावित रूप से एक देश है।

0

कोई भी फ़िल्टर विधि है जो कहता है "किसी भी आइटम को स्वीकार करें जो निम्नलिखित मानदंडों को पूरा करता है।" ए => ... व्यवसाय का अर्थ है "पैरामीटर को देखते हुए, यहां एक विधि है" - जैसा कि अन्य ने कहा है, इसका प्रयोग लैम्ब्डा अभिव्यक्तियों के लिए किया जाता है। संपादित करें:

 
From a as Adress in t.TravelRoute 
Where a.Country = "F" 
Select a 

किसी भी इसका मतलब है: बदल "संपत्ति" "पैरामीटर"

+0

संकलक कैसे पता लगा सकता है कि पैरामीटर किस प्रकार है? प्रकार निर्दिष्ट नहीं है, केवल एक ही है। लेकिन मुझे इंटेलिसेंस भी मिलता है जो मुझे देश का सदस्य प्रदान करता है। यह अच्छा और सही है लेकिन समझना मुश्किल है ... – Slauma

+0

लैम्ब्डा अभिव्यक्ति आमतौर पर उनके वाक्यविन्यास में गूढ़ होती है, लेकिन छोटी और कुशल होती है। –

+0

कंपाइलर अक्सर इसका उपयोग करके इसका उपयोग कर सकते हैं कि आप इसका उपयोग कैसे कर रहे हैं। इस मामले में, किसी भी() फ़ंक्शन के हस्ताक्षर के लिए Func प्रकार का पैरामीटर आवश्यक है, जिसका अर्थ है कि यह एक फ़ंक्शन चाहता है जो एक स्ट्रिंग स्वीकार करता है और एक बूल देता है - एक मानक फ़िल्टर फ़ंक्शन। इस प्रकार संकलक जानता है कि लैम्ब्डा का इलाज कैसे करें, और यदि आपने एक int वापस करने के लिए लैम्ब्डा लिखा है, उदाहरण के लिए, आपको एक कंपाइलर त्रुटि मिल जाएगी। – expedient

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