LeeTaes 공부노트

[C#] LINQ(Language Integrated Query) 본문

Game Programming/C#

[C#] LINQ(Language Integrated Query)

리태s 2024. 6. 30. 14:26
728x90
반응형

LINQ란?

LINQ는 Language Integrated Query의 약자로 통합된 질의 언어를 의미합니다.

C# 언어의 강력한 기능 중 하나로, 데이터 집합을 쿼리하는 표준화된 방법을 제공합니다.

 

즉, LINQ를 통해 컬렉션 형태를 띄는 모든 데이터에 질의를 할 수 있으며, 데이터 처리와 관련된 복잡한 로직을 직관적이고 명확하게 표현할 수 있습니다.

사용 예시 1

간단히 1 ~ 10의 데이터가 들어있는 리스트에서 5 이상의 데이터들을 추출한다고 가정해보도록 하겠습니다.

일반적으로 작성한다면 다음과 같은 형태의 코드가 만들어질 것입니다.

List<int> ints = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9};

List<int> answer = new List<int>();

foreach (int num in ints)
{
    if (num >= 5)
    {
        answer.Add(num);
    }
}

answer : 5 6 7 8 9

 

이를 LINQ 쿼리식을 사용하여 다시 작성해본다면?

List<int> ints = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9};

// ints에 들어있는 값들 중 5 이상의 값들을 추출하기 위한 기본 쿼리 구문
// * .ToList()로 반환타입 List로 수정
List<int> answer = (from n in ints where n >= 5 select n).ToList();

answer : 5 6 7 8 9

 

동일한 결과를 가지지만 더욱 간결하게 작성이 가능한 것을 확인할 수 있습니다.

또한 람다식을 활용하여 더욱 간편하게 구현이 가능합니다.

// 메서드 구문(위와 동일한 결과)
List<int> answer = ints.Where(n => n >= 5).ToList();

answer : 5 6 7 8 9

 

LINQ의 기본 구조

  • from - 어떤 데이터에서 값을 추출할 것인지
  • where - 원하는 값을 추출하기 위한 조건
  • select - 데이터에서 어떤 항목을 추출할 것인지

From절

LINQ에서 from절은 데이터 소스로부터 데이터를 가져오는 역할을 수행합니다.

// from 개별 데이터 in 소스 데이터
from n in ints

Where절

LINQ에서 where절은 추출된 데이터가 특정 조건을 만족하는지 필터링 해주는 역할을 수행합니다.

// ints로부터 추출한 n이 5보다 같거나 큰 경우를 판별
from n in ints where n >= 5

Orderby절 (정렬)

LINQ에서 orderby절은 데이터 소스에서 추출된 요소들을 특정한 기준에 따라 정렬하는 역할을 수행합니다.

  • ascending : 오름차순
  • descending : 내림차순

Select절

LINQ에서 select절은 결과물을 원하는 형태로 변형하여 최종적인 결과물을 뽑아내는 역할을 수행합니다.

예시에서 만약 추출 결과물을 해당 요소의 제곱으로 출력하고 싶은 경우라면 select 절을 n * n으로 수정해주면 됩니다.

// 출력 결과 : 25 36 49 ...
List<int> answer = (from n in ints where n >= 5 select n * n).ToList();

사용 예시 2

마지막으로  LINQ 쿼리식을 사용해 Num과 Name 멤버변수를 가지는 간단한 클래스를 만들고 특정 조건에 따라 필터링 한 후 정렬하는 코드를 작성해보도록 하겠습니다.

class Test
{
    public Test(int num, string name)
    {
        Num = num;
        Name = name;
    }

    public int Num { get; set; }
    public string Name { get; set; }
}

static void Main(string[] args)
{
    List<Test> tests = new List<Test>();

    tests.Add(new Test(num: 20, name: "홍길동"));
    tests.Add(new Test(num: 8, name: "짱구"));
    tests.Add(new Test(num: 15, name: "철수"));

    // tests에서 num이 10 이상인 요소를 num 순으로 정렬하기
    List<Test> result = (from t in tests where t.Num >= 10 orderby t.Num ascending select t).ToList();

    // tests에서 num이 10 이상인 요소를 num 순으로 정렬하기
    List<Test> result2 = tests.Where(n => n.Num >= 10).OrderBy(n => n.Num).ToList();
}

 

728x90
반응형

'Game Programming > C#' 카테고리의 다른 글

[C#] 람다식  (0) 2024.06.30
[C#] 얕은 복사 vs 깊은 복사 (Shallow Copy vs Deep Copy)  (0) 2024.06.29
[C#] 의존성 주입(DI, Dependency Injection)  (0) 2024.06.29
[C#] as, is  (0) 2024.06.25
[C#] Delegate  (0) 2024.06.25