수색…
비고
람다 식은 익명 함수를 인라인으로 만드는 구문입니다. 보다 공식적으로 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