English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

LINQ Lambda 표현식

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 표현식

위의 lambda 표현식은 절대 유효하지만, 하나의 반환 값의 문장만 있다면 대괄호, return 및 세미콜론이 필요하지 않습니다. 따라서 제거할 수 있습니다.

또한, 하나의 파라미터만 있다면, 괄호()를 제거할 수 있습니다.

익명 메서드에서의 Lambda 표현식

따라서, 우리는 다음과 같은 lambda 표현식을 얻습니다: s => s.Age > 12 && s.Age < 20 중s파라미터는 다음과 같습니다:=>lambda 연산자는 다음과 같습니다:s.Age > 12 && s.Age < 20표현식 주체는 다음과 같습니다:

C#에서의 Lambda 표현식 구조

VB.Net에서 lambda 표현식을 얻는 방법은 다음과 같이 작성할 수 있습니다:

VB.Net에서의 Lambda 표현식 구조

lambda 표현식의 호출 방식은 ()를 사용한 대리자 호출 방식과 동일합니다.

주의: VB.Net은 lambda 연산자 =>를 지원하지 않습니다

여러 파라미터를 가진 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 표현식에서는 최소한 하나의 파라미터가 필요하지 않습니다. lambda 표현식은 파라미터 없이도 지정할 수 있습니다.

() => Console.WriteLine("파라미터 없는 lambda 표현식")

Lambda 표현식 주체에서의 여러 문장

주체 내에 여러 문장을 포함하려면 표현식을 중괄호로 감싸세요:

(s, youngAge) =>{
  Console.WriteLine("주체 내에 여러 문장을 포함한 Lamda 표현식");
    
  Return s.Age >= youngAge;}
Function(s , youngAge)
    
    Console.WriteLine("주체 내에 여러 문장을 포함한 Lamda 표현식")
    
    Return s.Age >= youngAge
End Function

Lamda 표현식 주체 내에서 로컬 변수 선언

표현식 주체 내에서 변수를 선언하여 표현식 주체의 어디서든 사용할 수 있습니다. 예를 들어:

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 표현식을 위임에 할당

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> 대리자 요구사항을 충족시킵니다. 다음과 같이 표시됩니다:

Lambda 표현식을 가진 Func 대리자

위에 표시된 Func <> 대리자는 다음과 같은 함수로 변환됩니다.

bool isStudentTeenAger(Student s)
{
    return s.Age > 12 && s.Age < 20;
}

Action 대리자

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

LINQ 쿼리의 Lambda 표현식

일반적으로 lambda 표현식은 LINQ 쿼리와 함께 사용됩니다. 인수 가능한 정적 클래스는 그 중에서도 Func<TSource, bool>를 받는 IEnumerable<T> 확장 메서드를 포함하고 있습니다. 따라서 수집된 Where() 확장 메서드 IEnumerable<Student>는 Func<Student, bool>를 통해 다음과 같이 필요합니다:

Where 확장 메서드의 Func 위임 매개변수

따라서 지금 현재, 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 위임을 전달할 수 있습니다。

기억해야 할 포인트

  1. Lambda 표현식은 익명 메서드를 나타내는 간결한 방법입니다。

  2. Lambda 표현식 문법: 매개변수 => 표현식 주체

  3. Lambda 표현식은 매개변수가 없을 수 있습니다。

  4. Lambda 표현식의 대括号()에는 여러 개의 매개변수가 있을 수 있습니다。

  5. Lambda 표현식은 대括号{} 내의 주체 표현식에서 여러 문장을 포함할 수 있습니다。

  6. Lambda 표현식은 Func, Action 또는 Predicate 위임에 할당될 수 있습니다。

  7. Lambda Expression을 위임과 유사하게 호출할 수 있습니다。