खोज…


टिप्पणियों

अनाम कार्यों को बनाने के लिए एक लंबोदर अभिव्यक्ति एक वाक्यविन्यास है। C # प्रोग्रामिंग गाइड से अधिक औपचारिक रूप से:

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

एक लंबर एक्सप्रेशन => ऑपरेटर का उपयोग करके बनाया गया है। ऑपरेटर के बाईं ओर किसी भी पैरामीटर को रखें। दाहिनी ओर, एक अभिव्यक्ति डालें जो उन मापदंडों का उपयोग कर सकती है; यह अभिव्यक्ति फ़ंक्शन की वापसी मान के रूप में हल करेगी। अधिक शायद ही कभी, यदि आवश्यक हो, तो दाएं तरफ एक पूरे {code block} का उपयोग किया जा सकता है। यदि रिटर्न प्रकार शून्य नहीं है, तो ब्लॉक में रिटर्न स्टेटमेंट होगा।

एक विधि के लिए एक पैरामीटर के रूप में एक लैम्ब्डा एक्सप्रेशन पास करना

List<int> l2 = l1.FindAll(x => x > 6);

यहाँ x => x > 6 एक लंबोदर अभिव्यक्ति है जो एक विधेय के रूप में कार्य करता है जो यह सुनिश्चित करता है कि केवल 6 से ऊपर के तत्व वापस आए।

लैम्बडा एक्सप्रेशंस शॉर्टहैंड फॉर डेलिगेट इनिशियलाइज़ेशन

public delegate int ModifyInt(int input);
ModifyInt multiplyByTwo = x => x * 2;

उपरोक्त लैम्बडा अभिव्यक्ति वाक्यविन्यास निम्नलिखित क्रिया कोड के बराबर है:

public delegate int ModifyInt(int input);

ModifyInt multiplyByTwo = delegate(int x){
    return x * 2;
};

`फंक` और` एक्शन` दोनों के लिए लम्बदा

आमतौर पर लंबोदा का उपयोग सरल कार्यों को परिभाषित करने के लिए किया जाता है (आमतौर पर एक लाइनक अभिव्यक्ति के संदर्भ में))

var incremented = myEnumerable.Select(x => x + 1);

यहां return निहित है।

हालाँकि, कार्रवाई को लंबोदर के रूप में पारित करना भी संभव है:

myObservable.Do(x => Console.WriteLine(x));

कई पैरामीटर या कोई पैरामीटर के साथ लैम्ब्डा एक्सप्रेशन

कई मापदंडों को इंगित करने के लिए => ऑपरेटर के बाईं ओर अभिव्यक्ति के चारों ओर कोष्ठक का उपयोग करें।

delegate int ModifyInt(int input1, int input2);
ModifyInt multiplyTwoInts = (x,y) => x * y;

इसी तरह, कोष्ठकों का एक खाली सेट इंगित करता है कि फ़ंक्शन मापदंडों को स्वीकार नहीं करता है।

delegate string ReturnString();
ReturnString getGreeting = () => "Hello world.";

एक स्टेटमेंट लेम्बडा में कई स्टेटमेंट्स डालें

एक एक्सप्रेशन लैम्ब्डा के विपरीत, एक स्टेटमेंट लैम्बडा में सेमीकोलन द्वारा अलग-अलग कई स्टेटमेंट हो सकते हैं।

delegate void ModifyInt(int input);

ModifyInt addOneAndTellMe = x =>
{
    int result = x + 1;
    Console.WriteLine(result);
};

ध्यान दें कि स्टेटमेंट ब्रेसेस {} में संलग्न हैं।

याद रखें कि अभिव्यक्ति वृक्ष बनाने के लिए लैंबडास का उपयोग नहीं किया जा सकता है।

लैम्ब्डा को 'फंक' और 'एक्सप्रेशन' दोनों के रूप में उत्सर्जित किया जा सकता है

निम्नलिखित Person वर्ग मानते हुए:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

निम्नलिखित लंबोदर:

p => p.Age > 18

दोनों तरीकों के लिए एक तर्क के रूप में पारित किया जा सकता है:

public void AsFunc(Func<Person, bool> func)
public void AsExpression(Expression<Func<Person, bool>> expr)

क्योंकि कंपाइलर लैम्बदास को प्रतिनिधि और Expression एस दोनों में बदलने में सक्षम है।

जाहिर है, LINQ प्रदाता प्रश्नों को पार्स करने और प्रश्नों को संग्रहीत करने के लिए उनका अनुवाद करने में सक्षम होने के लिए Expression s ( IQueryable<T> इंटरफ़ेस के माध्यम से मुख्य रूप से उजागर) पर बहुत अधिक भरोसा करते हैं।

इवेंट हैंडलर के रूप में लैम्ब्डा एक्सप्रेशन

घटनाओं को संभालने के लिए लैम्ब्डा के भावों का उपयोग किया जा सकता है, जो तब उपयोगी होता है:

  • हैंडलर छोटा है।
  • हैंडलर को कभी भी सदस्यता समाप्त करने की आवश्यकता नहीं है।

एक अच्छी स्थिति जिसमें लैम्बडा ईवेंट हैंडलर का उपयोग किया जा सकता है, नीचे दिया गया है:

smtpClient.SendCompleted += (sender, args) => Console.WriteLine("Email sent");

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

EventHandler handler = (sender, args) => Console.WriteLine("Email sent");

smtpClient.SendCompleted += handler;
smtpClient.SendCompleted -= handler;

इसका कारण यह है कि यह लैंबडा अभिव्यक्ति शब्दशः को समाप्त करने के बजाय इसे अनसब्सक्राइब करने के लिए किया गया है ( -= ) यह है कि C # संकलक जरूरी नहीं कि दो अभिव्यक्तियों को समान समझे:

EventHandler handlerA = (sender, args) => Console.WriteLine("Email sent");
EventHandler handlerB = (sender, args) => Console.WriteLine("Email sent");
Console.WriteLine(handlerA.Equals(handlerB)); // May return "False"

ध्यान दें कि यदि अतिरिक्त स्टेटमेंट को लैम्ब्डा एक्सप्रेशन में जोड़ा जाता है, तो कंपाइल-टाइम त्रुटि पैदा किए बिना, आसपास के घुंघराले ब्रेसिज़ की आवश्यकता आकस्मिक रूप से छोड़ी जा सकती है। उदाहरण के लिए:

smtpClient.SendCompleted += (sender, args) => Console.WriteLine("Email sent"); emailSendButton.Enabled = true;

यह संकलित करेगा, लेकिन लंबोदर अभिव्यक्ति (sender, args) => Console.WriteLine("Email sent"); को जोड़ने का परिणाम देगा (sender, args) => Console.WriteLine("Email sent"); एक ईवेंट हैंडलर के रूप में, और स्टेटमेंट emailSendButton.Enabled = true; हाथोंहाथ। इसे ठीक करने के लिए, लैम्ब्डा की सामग्री को घुंघराले ब्रेसिज़ में घिरा होना चाहिए। प्रारंभ से घुंघराले ब्रेसिज़ का उपयोग करके इससे बचा जा सकता है, एक लंबर-इवेंट-हैंडलर में अतिरिक्त स्टेटमेंट जोड़ते समय सतर्क रहना, या शुरुआत से गोल कोष्ठक में लैम्ब्डा के आसपास होना:

smtpClient.SendCompleted += ((sender, args) => Console.WriteLine("Email sent"));
//Adding an extra statement will result in a compile-time error


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow