수색…


비고

람다 식은 익명 함수를 인라인으로 만드는 구문입니다. 보다 공식적으로 C # 프로그래밍 가이드 :

람다 식은 익명 함수로, 위임 자나 식 트리 형식을 만드는 데 사용할 수 있습니다. 람다 식을 사용하여 인수로 전달되거나 함수 호출의 값으로 반환 될 수있는 로컬 함수를 작성할 수 있습니다.

람다 식은 => 연산자를 사용하여 만듭니다. 연산자의 왼쪽면에 매개 변수를 넣으십시오. 오른편에, 이러한 매개 변수를 사용할 수있는 표현식을 입력하십시오. 이 표현식은 함수의 반환 값으로 해석됩니다. 거의 필요한 경우, 전체 {code block} 을 오른쪽에 사용할 수 있습니다. 반환 유형이 void가 아닌 경우 블록에는 return 문이 포함됩니다.

람다 표현식을 매개 변수로 메소드에 전달하기

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;
};

Lambda는 'Func'과 'Action'모두를 지원합니다.

일반적으로 lambda는 (일반적으로 linq 표현식의 문맥에서) 간단한 함수 를 정의하는 데 사용됩니다.

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

여기서 return 은 암시 적입니다.

그러나 lambda로 액션 을 전달할 수도 있습니다.

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.";

여러 문을 문에 넣기 람다

표현식 람다와 달리 람다 (lambda)는 세미콜론으로 분리 된 여러 문장을 포함 할 수 있습니다.

delegate void ModifyInt(int input);

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

명령문은 중괄호 {} 로 묶습니다.

성명 람다는 표현 트리를 만드는 데 사용할 수 없다는 것을 기억하십시오.

람다는`Func`과`Expression` 둘 다로 방출 될 수 있습니다.

다음 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 (주로 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"); 이벤트 처리기로 사용하고 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