LINQ-람다 식

'람다 식'이라는 용어는 함수 정의에 적용되는 수학적 표기법 인 '람다'미적분에서 그 이름을 파생했습니다. LINQ 방정식의 실행 가능한 부분 인 Lambda 표현식은 런타임에 로직을 변환하므로 데이터 소스에 편리하게 전달할 수 있습니다. 그러나 람다 식은 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();
      }
   }
}

VB

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

식 람다

위에 표시된 람다 식 구문의식이 오른쪽에 있으므로 식 람다라고도합니다.

비동기 Lambda

async 키워드를 사용하여 비동기 처리를 통합하여 만든 람다 식을 비동기 람다라고합니다. 다음은 비동기 람다의 예입니다.

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

표준 쿼리 연산자의 Lambda

쿼리 연산자 내의 람다 식은 요청시 동일하게 평가되며 전체 시퀀스가 ​​아닌 입력 시퀀스의 각 요소에서 지속적으로 작동합니다. 개발자는 Lambda 표현식을 통해 표준 쿼리 연산자에 자체 로직을 제공 할 수 있습니다. 아래 예제에서 개발자는 'Where'연산자를 사용하여 람다 식을 사용하여 주어진 목록에서 홀수 값을 회수했습니다.

씨#

//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();
      }
   }
}

VB

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

Lambda의 유형 추론

C #에서 형식 추론은 형식을 명시 적으로 지정하지 않고도 다양한 상황에서 편리하게 사용됩니다. 그러나 람다 식의 경우 컴파일러가 충족되어야하므로 각 형식이 지정된 경우에만 형식 유추가 작동합니다. 다음 예를 살펴 보겠습니다.

delegate int Transformer (int i);

여기서 컴파일러는 x가 정수라는 사실에 기반하여 유형 추론을 사용하며 이는 Transformer의 매개 변수 유형을 검사하여 수행됩니다.

Lambda 표현식의 가변 범위

람다 식 내에서 시작된 변수가 외부 메서드에서 표시되지 않는 것과 같은 람다 식에서 변수 범위를 사용하는 동안 몇 가지 규칙이 있습니다. 또한 캡처 된 변수는 동일한 것을 참조하는 대리자가 가비지 수집 작업에 적합하지 않는 한 가비지 수집되지 않는다는 규칙이 있습니다. 또한 람다 식 내에서 반환 문이 둘러싸는 메서드를 반환하는 것을 금지하는 규칙이 있습니다.

다음은 람다 식의 변수 범위를 보여주는 예제입니다.

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와 같은 이진 연산 일 수있는 트리와 유사한 데이터 구조의 코드를 제공합니다. 다음은 식 트리를 구성하기 위해 람다 식을 사용하는 예입니다.

문 Lambda

도 있습니다 statement lambdas두 개 또는 세 개의 문으로 구성되지만 식 트리 구성에는 사용되지 않습니다. return 문은 문 람다로 작성되어야합니다.

문의 람다 구문

(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

Lambda는 메서드를 기반으로하는 LINQ 쿼리의 인수로 사용되며 다음과 같은 연산자의 왼쪽에 위치를 허용하지 않습니다. is 또는 as익명의 방법과 같습니다. Lambda 식은 익명 메서드와 매우 비슷하지만 대리자로만 사용하도록 제한되지는 않습니다.

람다 식을 사용할 때 기억해야 할 사항

  • 람다 식은 값을 반환 할 수 있으며 매개 변수를 가질 수 있습니다.

  • 람다 식을 사용하여 다양한 방법으로 매개 변수를 정의 할 수 있습니다.

  • 람다 식에 단일 문이 있으면 중괄호가 필요하지 않지만 문이 여러 개 있으면 중괄호와 반환 값이 작성에 필수적입니다.

  • 람다 식을 사용하면 클로저라고하는 기능을 통해 람다 식 블록 외부에있는 변수에 액세스 할 수 있습니다. 클로저 사용은 문제가 발생하지 않도록주의하여 수행해야합니다.

  • 람다 식 내에서 안전하지 않은 코드를 실행하는 것은 불가능합니다.

  • 람다 식은 연산자의 왼쪽에서 사용하기위한 것이 아닙니다.