English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
C#3.0 (.NET 3.5)는 lambda 표현식 및 LINQ를 도입했습니다. lambda 표현식은 익명 메서드를 표현하는 특별한 문법을 사용하는 짧은 방법입니다.
예를 들어, 다음과 같은 익명 메서드를 사용하여 학생이 청소년인지 확인합니다:
delegate(Student s) { return s.Age >} 12 && s.Age < 20; };
Dim isStudentTeenAger = Function(s As Student) As Boolean Return s.Age > 12 And s.Age < 20 End Function
C#과 VB.Net에서의 Lambda 표현식을 사용하여 위의 익명 메서드를 다음과 같이 표현할 수 있습니다:
s => s.Age > 12 && s.Age < 20
Function(s) s.Age > 12 And s.Age < 20
lambda 표현식이 다음과 같은 익명 메서드에서 어떻게 발전되는지 보여드리겠습니다.
delegate(Student s) { return s.Age >} 12 && s.Age < 20; };
Lambda 표현식은 익명 메서드에서 제거된 대리자 키워드와 파라미터 타입을 추가한 후 lambda 연산자 =>를 추가하여 발전된 것입니다.
위의 lambda 표현식은 절대 유효하지만, 하나의 반환 값의 문장만 있다면 대괄호, return 및 세미콜론이 필요하지 않습니다. 따라서 제거할 수 있습니다.
또한, 하나의 파라미터만 있다면, 괄호()를 제거할 수 있습니다.
따라서, 우리는 다음과 같은 lambda 표현식을 얻습니다: s => s.Age > 12 && s.Age < 20 중s파라미터는 다음과 같습니다:=>lambda 연산자는 다음과 같습니다:s.Age > 12 && s.Age < 20표현식 주체는 다음과 같습니다:
VB.Net에서 lambda 표현식을 얻는 방법은 다음과 같이 작성할 수 있습니다:
lambda 표현식의 호출 방식은 ()를 사용한 대리자 호출 방식과 동일합니다.
주의: VB.Net은 lambda 연산자 =>를 지원하지 않습니다
여러 파라미터를 전달하려면, 파라미터를 괄호로 감싸如下所示:
예제: Lambda 표현식에서 여러 파라미터 지정 C#
(s, youngAge) => s.Age >= youngage;
파라미터 표현이 명확하지 않다면, 각 파라미터의 타입을 제공할 수도 있습니다:
(Student s, int youngAge) => s.Age >= youngage;예제: Lambda 표현식에서 여러 파라미터 지정 VB.Net
Function(s, youngAge) s.Age >= youngAge
lambda 표현식에서는 최소한 하나의 파라미터가 필요하지 않습니다. lambda 표현식은 파라미터 없이도 지정할 수 있습니다.
() => Console.WriteLine("파라미터 없는 lambda 표현식")
주체 내에 여러 문장을 포함하려면 표현식을 중괄호로 감싸세요:
(s, youngAge) =>{ Console.WriteLine("주체 내에 여러 문장을 포함한 Lamda 표현식"); Return s.Age >= youngAge;}
Function(s , youngAge) Console.WriteLine("주체 내에 여러 문장을 포함한 Lamda 표현식") Return s.Age >= youngAge End Function
표현식 주체 내에서 변수를 선언하여 표현식 주체의 어디서든 사용할 수 있습니다. 예를 들어:
s => { int youngAge = 18; Console.WriteLine("주체 내에 여러 문장을 포함한 Lamda 표현식"); return s.Age >= youngAge; }
Function(s) Dim youngAge As Integer = 18 Console.WriteLine("주체 내에 여러 문장을 포함한 Lamda 표현식") Return s.Age >= youngAge End Function
Lamda 표현식은 Func, Action 및 Predicate와 같은 내장 위임에도 할당할 수 있습니다.
Lamda 표현식을 Func<in T, out TResult> 위임 유형에 할당할 수 있습니다. Func 위임의 마지막 파라미터 유형은 반환 유형이며, 나머지 파라미터는 입력 파라미터입니다.C# 튜토리얼의 Func 위임 부분에 접근하여 더 많은 정보를 얻으세요.
다음과 같은 Lamda 표현식을 고려하여 학생이 청소년인지 확인해 보세요.
Func<Student, bool> isStudentTeenAger = s => s.age > 12 && s.age < 20; Student std = new Student() { age = 21 }; bool isTeen = isStudentTeenAger(std);// false를 반환
Dim isStudentTeenAger As Func(Of Student, Boolean) = Function(s) s.Age > 12 And s.Age < 20 Dim stud As New Student With {.Age = 21} Dim isTeen As Boolean = isStudentTeenAger(stud) // false를 반환합니다}}
위의 예제에서 Func 대리자는 첫 번째 입력 매개변수가 Student 유형이고 반환 유형이 부울 값인 것을 기대합니다. lambda 표현식 s => s.age > 12 && s.age < 20은 Func<Student, bool> 대리자 요구사항을 충족시킵니다. 다음과 같이 표시됩니다:
위에 표시된 Func <> 대리자는 다음과 같은 함수로 변환됩니다.
bool isStudentTeenAger(Student s) { return s.Age > 12 && s.Age < 20; }
Func 대리자와 달리Action 대리자Action 대리자는 입력 매개변수를 가질 수 있습니다. lambda 표현식에서 값을 반환하지 않을 때 Action 대리자 타입을 사용하십시오.
Action<Student> PrintStudentDetail = s => Console.WriteLine("Name: {0}, Age: ",1}, s.StudentName, s.Age); Student std = new Student() { StudentName = "Bill", Age =21}; PrintStudentDetail(std);//출력: Name: Bill, Age: 21
Dim printStudentDetail As Action(Of Student) = Sub(s) Console.WriteLine("Name: {0}, Age: ",1}, s.StudentName, s.Age) Dim stud As New Student With { .StudentName = "Bill", .Age = 21} printStudentDetail(stud)//출력: Name: Bill, Age: 21
일반적으로 lambda 표현식은 LINQ 쿼리와 함께 사용됩니다. 인수 가능한 정적 클래스는 그 중에서도 Func<TSource, bool>를 받는 IEnumerable<T> 확장 메서드를 포함하고 있습니다. 따라서 수집된 Where() 확장 메서드 IEnumerable<Student>는 Func<Student, bool>를 통해 다음과 같이 필요합니다:
따라서 지금 현재, Func 위임에 할당된 Lambda 표현식을 확장 메서드 Where()와 같이 메서드 문법으로 전달할 수 있습니다:
IList<Student> studentList = new List<Student>{...}; Func<Student, bool> isStudentTeenAger = s => s.age > 12 && s.age < 20; var teenStudents = studentList.Where(isStudentTeenAger).ToList<Student>();
IList<Student> studentList = new List<Student>{...}; Func<Student, bool> isStudentTeenAger = s => s.age > 12 && s.age < 20; var teenStudents = from s in studentList where isStudentTeenAger(s) select s;
VB.Net에서는 동일한 방법으로 Func 위임을 전달할 수 있습니다。
Lambda 표현식은 익명 메서드를 나타내는 간결한 방법입니다。
Lambda 표현식 문법: 매개변수 => 표현식 주체
Lambda 표현식은 매개변수가 없을 수 있습니다。
Lambda 표현식의 대括号()에는 여러 개의 매개변수가 있을 수 있습니다。
Lambda 표현식은 대括号{} 내의 주체 표현식에서 여러 문장을 포함할 수 있습니다。
Lambda 표현식은 Func, Action 또는 Predicate 위임에 할당될 수 있습니다。
Lambda Expression을 위임과 유사하게 호출할 수 있습니다。