LINQ - लम्बडा एक्सप्रेशंस

'लैम्ब्डा एक्सप्रेशन' शब्द का नाम 'लैम्ब्डा' कैलकुलस से लिया गया है, जो बदले में एक गणितीय अंकन है जिसे परिभाषित कार्यों के लिए लागू किया जाता है। LINQ समीकरण के निष्पादन योग्य भाग के रूप में लैम्ब्डा एक्सप्रेशंस रन टाइम में एक तरह से लॉजिक ट्रांसलेट करता है ताकि यह डेटा स्रोत पर आसानी से पास हो सके। हालाँकि, लैम्ब्डा एक्सप्रेशन केवल LINQ में एप्लिकेशन खोजने तक ही सीमित नहीं हैं।

ये भाव निम्नलिखित वाक्य विन्यास द्वारा व्यक्त किए गए हैं -

(Input parameters) ⇒ Expression or statement block

यहाँ एक लंबोदर अभिव्यक्ति का एक उदाहरण है -

y ⇒ y * y

उपरोक्त अभिव्यक्ति y नाम के पैरामीटर को निर्दिष्ट करती है और y का मान चुकता है। हालांकि, इस रूप में एक लंबोदर अभिव्यक्ति को निष्पादित करना संभव नहीं है। C # में लैम्बडा एक्सप्रेशन का उदाहरण नीचे दिखाया गया है।

सी#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace lambdaexample {
   class Program {

      delegate int del(int i);
      static void Main(string[] args) {

         del myDelegate = y ⇒ y * y;
         int j = myDelegate(5);
         Console.WriteLine(j);
         Console.ReadLine();
      }
   }
}

वीबी

Module Module1
   Private Delegate Function del(ByVal i As Integer) As Integer
   
   Sub Main(ByVal args As String())
   
      Dim myDelegate As del = Function(y) y * y
      Dim j As Integer = myDelegate(5)
      Console.WriteLine(j)
      Console.ReadLine()
	  
   End Sub
   
End Module

जब C # या VB के उपरोक्त कोड को संकलित और निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

25

अभिव्यक्ति लाम्बा

जैसा कि ऊपर दिखाया गया लैम्ब्डा अभिव्यक्ति के वाक्य विन्यास में अभिव्यक्ति दाहिने हाथ की तरफ है, इन्हें एक्सप्रेशन लैम्ब्डा के रूप में भी जाना जाता है।

Async लाम्बास

Async कीवर्ड के उपयोग द्वारा अतुल्यकालिक प्रसंस्करण को शामिल करके बनाई गई लैम्ब्डा अभिव्यक्ति को async lambdas के रूप में जाना जाता है। नीचे async lambda का उदाहरण दिया गया है।

Func<Task<string>> getWordAsync = async()⇒ “hello”;

मानक क्वेरी ऑपरेटरों में लैम्ब्डा

एक क्वेरी ऑपरेटर के भीतर एक लैम्ब्डा अभिव्यक्ति का मूल्यांकन मांग पर एक ही द्वारा किया जाता है और इनपुट अनुक्रम में प्रत्येक तत्व पर लगातार काम करता है और पूरे अनुक्रम में नहीं। डेवलपर्स को मानक क्वेरी ऑपरेटरों में अपने स्वयं के तर्क को खिलाने के लिए लैंबडा अभिव्यक्ति द्वारा अनुमति दी जाती है। नीचे दिए गए उदाहरण में, डेवलपर ने लैम्ब्डा अभिव्यक्ति का उपयोग करके दिए गए सूची से विषम मूल्यों को पुनः प्राप्त करने के लिए 'व्हेयर' ऑपरेटर का उपयोग किया है।

सी#

//Get the average of the odd Fibonacci numbers in the series... 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace lambdaexample {
   class Program {     
      static void Main(string[] args) {
      
         int[] fibNum = { 1, 1, 2, 3, 5, 8, 13, 21, 34 };
         double averageValue = fibNum.Where(num ⇒ num % 2 == 1).Average();
         Console.WriteLine(averageValue);
         Console.ReadLine();
      }
   }
}

वीबी

Module Module1

   Sub Main()
   
      Dim fibNum As Integer() = {1, 1, 2, 3, 5, 8, 13, 21, 34}
      Dim averageValue As Double = fibNum.Where(Function(num) num Mod 2 = 1).Average()
	  
      Console.WriteLine(averageValue)
      Console.ReadLine()
	  
   End Sub
   
End Module

जब उपरोक्त कोड संकलित और निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

7.33333333333333

लैंबडा में टाइप इंट्रेंस

C # में, विभिन्न प्रकार की स्थितियों में प्रकार का अनुमान आसानी से उपयोग किया जाता है और वह भी स्पष्ट रूप से प्रकारों को निर्दिष्ट किए बिना। हालाँकि एक लंबोदर अभिव्यक्ति के मामले में, प्रकार का अनुमान तभी काम करेगा जब प्रत्येक प्रकार को निर्दिष्ट किया गया हो क्योंकि कंपाइलर को संतुष्ट होना चाहिए। आइए निम्नलिखित उदाहरण पर विचार करें।

delegate int Transformer (int i);

यहां संकलक इस तथ्य पर आकर्षित करने के लिए टाइप इंफ़ेक्शन को नियोजित करता है कि x एक पूर्णांक है और यह ट्रांसफार्मर के पैरामीटर प्रकार की जांच करके किया जाता है।

लैम्ब्डा एक्सप्रेशन में वेरिएबल स्कोप

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

यहाँ लैम्बडा एक्सप्रेशन में वेरिएबल स्कोप प्रदर्शित करने के लिए एक उदाहरण दिया गया है।

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace lambdaexample {
   class Program {
      delegate bool D();
      delegate bool D2(int i);

      class Test {
         D del;
         D2 del2;
			
         public void TestMethod(int input) {
            int j = 0;
            // Initialize the delegates with lambda expressions.
            // Note access to 2 outer variables.
            // del will be invoked within this method.
            del = () ⇒ { j = 10; return j > input; };

            // del2 will be invoked after TestMethod goes out of scope.
            del2 = (x) ⇒ { return x == j; };

            // Demonstrate value of j:            
            // The delegate has not been invoked yet.
            Console.WriteLine("j = {0}", j);        // Invoke the delegate.
            bool boolResult = del();
           
            Console.WriteLine("j = {0}. b = {1}", j, boolResult);
         }

         static void Main() {
            Test test = new Test();
            test.TestMethod(5);

            // Prove that del2 still has a copy of
            // local variable j from TestMethod.
            bool result = test.del2(10);
           
            Console.WriteLine(result);

            Console.ReadKey();
         }
      }
   }
}

जब उपरोक्त कोड संकलित और निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

j = 0
j = 10. b = True
True

अभिव्यक्ति का पेड़

में लैंबडा भाव का प्रयोग किया जाता है Expression Treeबड़े पैमाने पर निर्माण। एक अभिव्यक्ति ट्री एक डेटा संरचना में एक पेड़ से मिलता-जुलता कोड देता है जिसमें प्रत्येक नोड अपने आप में एक मेथड कॉल की तरह एक अभिव्यक्ति है या x <y जैसे बाइनरी ऑपरेशन हो सकता है। नीचे एक अभिव्यक्ति पेड़ के निर्माण के लिए लैंबडा अभिव्यक्ति के उपयोग का एक उदाहरण है।

कथन लम्बदा

वहाँ भी statement lambdasदो या तीन बयानों से मिलकर, लेकिन अभिव्यक्ति पेड़ों के निर्माण में उपयोग नहीं किया जाता है। एक स्टेटमेंट लैम्बडा में एक रिटर्न स्टेटमेंट लिखा जाना चाहिए।

कथन lambda का सिंटेक्स

(params)⇒ {statements}

एक कथन लंबोदर का उदाहरण

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;

namespace lambdaexample {
   class Program {
      static void Main(string[] args) {
         int[] source = new[] { 3, 8, 4, 6, 1, 7, 9, 2, 4, 8 };

         foreach (int i in source.Where(x ⇒ 
            {
               if (x <= 3)
                  return true;
               else if (x >= 7)
                  return true;
               return false;
            }
         ))
        Console.WriteLine(i);
        Console.ReadLine();
      }
   }
}

जब उपरोक्त कोड संकलित और निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

3
8
1
7
9
2
8

Lambdas LINQ प्रश्नों में तर्कों के रूप में नियोजित हैं और कभी भी इसके संचालकों के बाईं ओर एक स्थान रखने की अनुमति नहीं है is या asअनाम तरीकों की तरह। हालाँकि, लैंबडा अभिव्यक्ति बहुत समान रूप से अनाम तरीके हैं, ये केवल प्रतिनिधियों के रूप में उपयोग करने के लिए प्रतिबंधित नहीं हैं।

लंबोदर भावों का उपयोग करते समय याद रखने वाले बिंदु

  • एक लैम्ब्डा अभिव्यक्ति एक मूल्य वापस कर सकती है और इसमें पैरामीटर हो सकते हैं।

  • पैरामीटर को लंबोदर अभिव्यक्ति के साथ असंख्य तरीकों से परिभाषित किया जा सकता है।

  • यदि एक लंबोदर अभिव्यक्ति में एकल कथन है, तो घुंघराले कोष्ठक की आवश्यकता नहीं है, जबकि यदि कई कथन हैं, तो घुंघराले कोष्ठक के साथ-साथ वापसी मूल्य भी लिखना आवश्यक है।

  • लैम्ब्डा एक्सप्रेशन के साथ, लैम्ब्डा एक्सप्रेशन ब्लॉक के बाहर मौजूद वैरिएबल को क्लोजर के रूप में जाना जाता है। किसी भी समस्या से बचने के लिए क्लोजर का उपयोग सावधानी से किया जाना चाहिए।

  • किसी भी लैम्ब्डा अभिव्यक्ति के अंदर किसी भी असुरक्षित कोड को निष्पादित करना असंभव है।

  • लैम्ब्डा एक्सप्रेशन का उपयोग ऑपरेटर के बाईं ओर होने के लिए नहीं है।