C#의 LINQ 문의 람다 식

Naila Saad Siddiqui 2024년2월15일
  1. C#의 LINQ
  2. C#의 LINQ 구문
  3. C#의 람다 식
  4. LINQ의 람다 식
C#의 LINQ 문의 람다 식

이 간단한 문서는 LINQ Select 쿼리의 람다 식에 관한 것입니다. 이를 위해 먼저 LINQ, 구문 및 람다 식에 대한 간략한 소개에 대해 설명합니다.

또한 LINQ Select 쿼리에서 람다 식을 사용하는 방법을 설명합니다.

C#의 LINQ

LINQ는 Language Integrated Query의 약자입니다. 개체, XML, SQL 데이터 서버, 데이터 세트 등과 같은 여러 데이터 소스에서 데이터를 쿼리하는 데 사용되는 단일 형식입니다.

해당 데이터 소스에 대한 유일한 요구 사항은 IEnumerable<T> 인터페이스를 구현하는 것입니다.

LINQ는 여러 이점을 제공합니다.

  1. LINQ는 데이터의 출처에 관계없이 개체 기반의 언어 통합 쿼리를 제공합니다. 따라서 LINQ를 사용하여 데이터베이스, XML 및 컬렉션을 쿼리할 수 있습니다.
  2. 컴파일 시 구문 확인.
  3. SQL을 사용하여 데이터베이스를 쿼리하는 것처럼 VB 또는 C#과 같은 응용 프로그램의 기본 언어로 배열, 열거 가능한 클래스 등과 같은 컬렉션을 쿼리할 수 있습니다.

숫자 목록이 있고 10보다 작은 숫자를 선택해야 하는 시나리오를 생각해 보세요. 그러면 LINQ 쿼리가 데이터를 선택하는 데 도움이 될 수 있습니다.

아래의 코드 세그먼트를 살펴보겠습니다.

using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp6 {
  class Program {
    static void Main(string[] args) {
      List<int> listOfNumbers = new List<int>() { 16, 11, 2, 5, 9, 8, 7, 6, 1, 12 };
      var result = from l in listOfNumbers
          where l<10 select l;
      foreach (int i in result) Console.WriteLine(i);
    }
  }
}

위의 LINQ 쿼리에서 이것이 SQL 데이터베이스에서 데이터를 쿼리하는 데 사용하는 쿼리 구문과 유사하다는 것을 알 수 있습니다. 여기서는 로컬 데이터 멤버 List에서 데이터를 쿼리하고 있습니다.

코드 세그먼트의 출력은 다음과 같습니다.

LINQ의 출력

C#의 LINQ 구문

LINQ로 프로그래밍하는 동안 사용되는 LINQ 구문에는 두 가지가 있습니다.

  1. 쿼리 구문
  2. 메소드 구문

LINQ의 쿼리 구문

LINQ 쿼리 구문은 .NET Framework 버전 3.5 이상에 정의된 쿼리 키워드 집합으로 구성됩니다. 이를 통해 프로그래머나 개발자는 따옴표를 사용하지 않고 코드(C# 또는 VB.NET)에 SQL 스타일 명령을 작성할 수 있습니다.

쿼리 식 구문이라고도 합니다.

from 키워드는 LINQ 쿼리 구문을 시작하고 Select 또는 GroupBy 키워드로 끝납니다. 키워드에 따라 필요에 따라 필터링, 그룹화 등 다양한 표준 쿼리 작업을 사용할 수 있습니다.

아래 예에서는 쿼리 구문을 사용하여 목록에서 데이터를 가져옵니다.

using System;
using System.Linq;
using System.Collections.Generic;

class LinqExample {
  static public void Main() {
    List<string> myList = new List<string>() { "Cat", "Dog", "Tiger", "Wolf" };

    // Create LINQ Query
    var result = from a in myList select a;

    // Executing the query
    foreach (var r in result) {
      Console.WriteLine(r);
    }
  }
}

그러면 다음과 같은 출력이 생성됩니다.

쿼리 구문 출력

LINQ의 메서드 구문

메서드 구문은 LINQ에서 Enumerable 또는 Queryable 정적 클래스의 확장 메서드를 호출하는 데 사용됩니다. 메서드 확장 구문이라고도 합니다.

반면에 컴파일러는 컴파일 타임에 항상 쿼리 구문을 메서드 구문으로 변환합니다. Select, Where, GroupBy, Join, Max 등과 같은 표준 쿼리 연산자를 사용할 수 있습니다.

쿼리 구문을 사용하지 않고 직접 호출할 수 있습니다.

아래 예에서는 메서드 구문을 사용하여 이름 길이가 3보다 큰 동물의 이름을 가져옵니다. 쿼리는 다음과 같이 구성됩니다.

var result = myList.Where(a => a.Length > 3);

메서드 구문의 전체 코드는 다음과 같습니다.

using System;
using System.Linq;
using System.Collections.Generic;

class LinqExample {
  static public void Main() {
    List<string> myList = new List<string>() { "Cat", "Dog", "Tiger", "Wolf" };

    // Create LINQ Query
    var result = myList.Where(a => a.Length > 3);

    // Executing the query
    foreach (var r in result) {
      Console.WriteLine(r);
    }
  }
}

그러면 다음과 같은 결과가 나타납니다.

메서드 구문 출력

메서드 구문에서 => 기호로 구성된 Where 함수의 인수에 표현식이 있음을 알 수 있습니다. 이 특이한 것은 람다 식으로 알려져 있습니다.

다음 섹션에서는 람다 식과 LINQ 쿼리의 사용에 대해 설명합니다.

C#의 람다 식

C#에서 람다 식은 익명 함수와 유사하게 사용되지만 람다 식을 사용할 때 입력하는 값의 유형을 지정할 필요가 없다는 점을 제외하면 더 유연합니다.

모든 람다 식은 => 기호로 표시되는 람다 연산자를 사용합니다. 입력은 람다 식의 왼쪽에 있고 식은 오른쪽에 있습니다.

람다 식은 두 가지 형식으로 분류됩니다.

  1. 식 람다
  2. 진술 람다

식 람다

이는 입력 문과 람다 기호 오른쪽에서 평가할 식으로 구성됩니다.

input statement => expression

성명서 람다

이것은 입력 문과 람다 기호의 오른쪽에 있는 문 집합으로 구성됩니다.

input statements => { set of statements }

일부 숫자로 구성된 목록 데이터 구조가 있고 모든 목록 번호의 큐브를 평가해야 한다고 가정합니다. 이는 람다 식을 사용하여 매우 간단하게 수행할 수 있습니다.

이는 아래 코드 세그먼트에서 확인할 수 있습니다.

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp6 {
  class Program {
    static void Main(string[] args) {
      List<int> listOfNumbers = new List<int>() { 16, 11, 2, 5, 9, 8, 7, 6, 1, 12 };
      var cubes = listOfNumbers.Select(a => a * a * a);

      // Display all the cubes
      Console.Write("Cubes of the List : ");
      foreach (var val in cubes) {
        Console.Write("{0} ", val);
      }
    }
  }
}

위의 코드 세그먼트에서 Select 기능을 사용하여 목록에서 요소를 선택한 다음 람다 식을 사용하여 큐브를 만든 것을 볼 수 있습니다.

세그먼트의 출력은 다음과 같습니다.

Lambda 식 출력

LINQ의 람다 식

Lambda 식과 LINQ는 모든 데이터 소스에서 데이터를 쿼리하는 방법을 제공합니다. 다음은 LINQ Lambda 구문을 사용하여 데이터를 쿼리하는 몇 가지 예입니다.

속성으로 roll_num, namemarks가 포함된 Student라는 사용자 정의 클래스가 있다고 가정합니다. 학생 목록의 일부 데이터를 초기화한 다음 LINQ 쿼리 및 람다 식을 사용하여 데이터를 쿼리합니다.

class Student {
  private int roll_num;
  private string name;
  private int marks;

  public int Roll_num {
    get => roll_num;
    set => roll_num = value;
  }
  public string Name {
    get => name;
    set => name = value;
  }
  public int Marks {
    get => marks;
    set => marks = value;
  }
}

Main 기능에서 Student 클래스 목록을 생성한 다음 여기에서 데이터를 쿼리합니다.

static void Main(string[] args) {
  List<Student> students =
      new List<Student>() { new Student { Roll_num = 1, Name = "David", Marks = 65 },
                            new Student { Roll_num = 2, Name = "John", Marks = 90 },
                            new Student { Roll_num = 3, Name = "Dina", Marks = 87 },
                            new Student { Roll_num = 4, Name = "Leen", Marks = 43 },
                            new Student { Roll_num = 5, Name = "Krish", Marks = 57 } };
}

목록을 만든 후 점수가 60점보다 큰 학생을 선택하여 사용자에게 표시해야 한다고 가정합니다. 이를 위해 람다 식과 LINQ 쿼리를 사용합니다.

Console.WriteLine("Through Lambda Expression");
IEnumerable<Student> sortedData = students.Where(x => x.Marks > 60);
foreach (var s in sortedData) Console.WriteLine(s.Roll_num + "  " + s.Name + "  " + s.Marks);

Console.WriteLine("Through LINQ query");
IEnumerable<Student> result = from s in students
    where s.Marks> 60 select s; foreach (var s in sortedData) Console.WriteLine(s.Roll_num + "  " + s.Name + "  " + s.Marks);

위의 코드 세그먼트에서 동일한 데이터를 두 가지 다른 방식으로 선택했습니다. Lambda 문을 통해 데이터 쿼리가 매우 간단하고 LINQ 쿼리보다 적은 코딩이 필요합니다.

출력은 두 경우 모두 동일합니다.

LINQ 대 람다 식의 출력

이전 예에서는 학생의 모든 데이터를 표시했습니다. 60점보다 높은 점수를 받은 학생의 이름을 가져와야 하는 경우 람다 식은 다음과 같습니다.

var stuNames = students.Where(x => x.Marks > 60).Select(x => x.Name);
foreach (var s in stuNames) Console.WriteLine(s);

그러면 학생의 이름만 반환됩니다. 따라서 IEnumerable 유형에 저장하지 않았습니다.

출력은 다음과 같습니다.

람다 식 1의 출력

학생들의 이름과 점수를 원하지만 먼저 점수를 기준으로 정렬해야 한다고 가정합니다. OrderBy 기능을 사용하여 데이터를 정렬합니다.

var stuNames = students.OrderBy(x => x.Marks).Select(x => new { x.Name, x.Marks });
foreach (var s in stuNames) Console.WriteLine(s.Name + "  " + s.Marks);

출력은 다음과 같습니다.

람다 식 2의 출력

따라서 다양한 메서드가 람다 식을 사용하여 데이터를 쿼리할 수 있음을 알 수 있습니다. 람다 식은 방대한 데이터가 있고 데이터에 다양한 작업을 쿼리하거나 적용하기 위해 최소한의 코딩 단계가 필요한 경우에 유용합니다.

관련 문장 - Csharp LINQ