C#

C# LINQ 활용법

samie 2025. 3. 26. 12:30
C# LINQ 활용법

C# LINQ 활용법

LINQ (Language Integrated Query)는 C#에서 데이터를 효율적으로 쿼리하고 처리하는 데 매우 유용한 기능입니다. LINQ를 사용하면 데이터 소스에 대해 SQL처럼 직관적이고 가독성 높은 쿼리를 작성할 수 있습니다. 이번 글에서는 LINQ의 기본 사용법과 다양한 활용 방법에 대해 소개하겠습니다.

1. LINQ 기본 개념

LINQ는 C#에서 데이터를 쿼리하는 언어 통합 쿼리입니다. LINQ를 사용하면 배열, 리스트, XML, 데이터베이스 등 다양한 데이터 소스를 쿼리할 수 있습니다. LINQ는 쿼리 구문과 메서드 구문 두 가지 형태로 사용할 수 있으며, 이를 통해 데이터를 필터링, 정렬, 그룹화, 변환 등을 할 수 있습니다.

기본적인 LINQ 구문은 다음과 같습니다:

var query = from item in collection
            where item.Property == value
            select item;
        

위의 구문은 데이터 컬렉션에서 특정 조건을 만족하는 항목을 선택하는 기본적인 LINQ 쿼리입니다.

2. LINQ 쿼리 예제

2.1. 배열에서 데이터 필터링하기

배열이나 리스트에서 특정 조건을 만족하는 데이터를 필터링하려면 LINQ의 `where` 키워드를 사용할 수 있습니다. 예를 들어, 숫자 배열에서 짝수만 필터링하려면 다음과 같이 작성할 수 있습니다:

int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var evenNumbers = from num in numbers
                  where num % 2 == 0
                  select num;

foreach (var num in evenNumbers)
{
    Console.WriteLine(num); // 출력: 2, 4, 6, 8
}
        

위 코드에서 `where`를 사용하여 배열에서 짝수만 필터링했습니다.

2.2. 컬렉션 정렬하기

LINQ를 사용하면 컬렉션을 쉽게 정렬할 수 있습니다. 예를 들어, 숫자 배열을 내림차순으로 정렬하려면 `OrderByDescending` 메서드를 사용할 수 있습니다:

var sortedNumbers = numbers.OrderByDescending(num => num);

foreach (var num in sortedNumbers)
{
    Console.WriteLine(num); // 출력: 9, 8, 7, 6, 5, 4, 3, 2, 1
}
        

`OrderByDescending` 메서드를 사용하여 내림차순으로 정렬된 결과를 출력할 수 있습니다.

2.3. 그룹화하기

LINQ를 사용하여 데이터를 그룹화할 수도 있습니다. 예를 들어, 이름의 첫 글자에 따라 사람들을 그룹화하려면 `group by` 키워드를 사용할 수 있습니다:

var people = new[]
{
    new { Name = "Alice", Age = 25 },
    new { Name = "Bob", Age = 30 },
    new { Name = "Charlie", Age = 35 },
    new { Name = "David", Age = 40 }
};

var groupedByFirstLetter = from person in people
                           group person by person.Name[0] into personGroup
                           select personGroup;

foreach (var group in groupedByFirstLetter)
{
    Console.WriteLine($"Group: {group.Key}");
    foreach (var person in group)
    {
        Console.WriteLine($"  {person.Name}, {person.Age}");
    }
}
        

위 코드는 사람들을 이름의 첫 글자에 따라 그룹화하여 출력하는 예제입니다. 각 그룹에 대해 `group by` 구문을 사용하였습니다.

3. LINQ 메서드 구문

LINQ는 메서드 구문을 사용하여 쿼리를 작성할 수도 있습니다. 메서드 구문은 더 직관적이고 체이닝이 가능하여 가독성을 높여줍니다.

3.1. `Where`, `Select` 메서드 사용하기

LINQ 메서드 구문에서 `Where`와 `Select`를 사용하여 데이터를 필터링하고 선택할 수 있습니다:

var filteredNumbers = numbers.Where(num => num % 2 == 0);
var selectedNumbers = filteredNumbers.Select(num => num * 2);

foreach (var num in selectedNumbers)
{
    Console.WriteLine(num); // 출력: 4, 8, 12, 16
}
        

`Where` 메서드로 조건을 걸고, `Select` 메서드로 변환된 값을 출력할 수 있습니다.

3.2. `OrderBy`와 `ThenBy` 메서드 사용하기

`OrderBy`와 `ThenBy` 메서드를 사용하여 컬렉션을 여러 기준으로 정렬할 수 있습니다. 예를 들어, 먼저 나이로 정렬하고, 그 다음 이름으로 정렬할 수 있습니다:

var sortedPeople = people.OrderBy(person => person.Age)
                         .ThenBy(person => person.Name);

foreach (var person in sortedPeople)
{
    Console.WriteLine($"{person.Name}, {person.Age}");
}
        

이 코드는 사람들을 나이순으로 정렬한 뒤, 같은 나이를 가진 사람들끼리 이름순으로 추가 정렬하는 예제입니다.

4. LINQ와 비동기 프로그래밍

C# 8.0부터는 LINQ에서 비동기 작업을 처리할 수 있는 `ToListAsync()`, `FirstOrDefaultAsync()` 등의 비동기 메서드가 추가되었습니다. 이러한 메서드를 사용하면 비동기 데이터 소스를 쿼리할 수 있습니다.

4.1. 비동기 LINQ 예제

다음은 비동기 작업을 LINQ로 처리하는 예제입니다:

public async Task GetDataAsync()
{
    var data = await dbContext.Items
        .Where(item => item.IsActive)
        .ToListAsync();

    foreach (var item in data)
    {
        Console.WriteLine(item.Name);
    }
}
        

이 코드는 비동기적으로 `dbContext`에서 활성화된 항목만 필터링하여 리스트로 가져오는 예제입니다.

5. LINQ 성능 최적화

LINQ는 매우 편리하지만, 성능이 중요한 경우 성능을 고려한 최적화가 필요합니다. 다음은 LINQ 성능 최적화를 위한 몇 가지 팁입니다:

  • Lazy Evaluation: LINQ 쿼리는 기본적으로 지연 평가를 사용합니다. 이로 인해 불필요한 계산을 피할 수 있지만, 필요할 때 `ToList()`나 `ToArray()` 등을 사용하여 즉시 평가하도록 할 수 있습니다.
  • 병렬 처리: `AsParallel()`을 사용하여 데이터를 병렬로 처리할 수 있습니다. 대규모 데이터셋에 대해 성능을 향상시킬 수 있습니다.
  • 불필요한 중복 제거: 쿼리에서 중복되는 연산을 피하고, 필요한 데이터만 쿼리하는 것이 중요합니다.

결론

LINQ는 C#에서 데이터를 처리하는 매우 강력하고 유용한 도구입니다. LINQ를 사용하면 간결하고 읽기 쉬운 코드로 데이터를 효율적으로 처리할 수 있습니다. LINQ의 다양한 기능을 활용하여 더 간결하고 성능 좋은 코드를 작성할 수 있으며, 비동기 프로그래밍과 결합하여 대규모 애플리케이션의 성능을 개선할 수도 있습니다.

참고할 만한 사이트