본문 바로가기
3.2 .net/C#

[C#] Linq (Language Integrated Query)

by Dohi._. 2024. 10. 22.
728x90

Linq (Language Integrated Query)

Linq는 배열, 컬렉션, 데이터베이스 및 XML과 같은 다양한 데이터 소스를 쿼리하는 통합된 접근 방식을 제공하는 C#의

using System.Linq;

1.쿼리

데이터 소스에서 데이터를 검색하는 식

  • from : 어떤 데이터에서 추출
  • where : 어떤 조건으로 추출
  • [order by : 어떤 기준으로 정렬]
  • select : 어떤 항목을 추출

모든 LINQ 쿼리 작업은 다음과 같은 세 가지 고유한 작업으로 구성

  • 데이터 소스 가져오기.
  • 쿼리 만들기.
  • 쿼리를 실행합니다.

LINQ에서 쿼리 실행은 쿼리와 다르다

쿼리 변수를 만들때 검색하는 게 아니기 때문입니다.

그냥 들으면 이해가 안되기 때문에 
아래 코드를 보고 설명을 하도록 하겠습니다.

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

class Program
{
    static void Main()
    {
        // 1.데이터 소스: 숫자 리스트
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };

        // 2. 쿼리 정의 (실제 데이터 검색은 하지 않음)
        //IEnumerable<int> query
        var query = from n in numbers
                    where n % 2 == 0 //짝수선택 
                    select n;

        // 3. 쿼리 실행 (데이터 검색)
        foreach (var num in query)
        {
            Console.WriteLine(num); // 결과: 2, 4, 6
        }

        // e.g. 지연 실행 
        // 4. 새로운 데이터 소스
        numbers.Add(8);

        // 쿼리 실행 
        foreach (var num in query)
        {
            Console.WriteLine(num); // 결과: 2, 4, 6, 8
        }
    }
}
  1. 데이터 소스: numbers라는 리스트를 사용하고자 만들었습니다.
  2. 쿼리 정의: query 변수에 LINQ 쿼리를 정의합니다. 이 시점에서는 실제 데이터에 접근하지 않습니다.
  3. 쿼리 실행: foreach 문을 사용하여 쿼리를 실행하고 결과를 출력합니다. 이때 쿼리 조건에 맞는 데이터가 검색됩니다.
  4. 새로운 데이터 소스 :리스트에 새로운 숫자(8)를 추가
  5. 쿼리 실행: 쿼리를 다시 실행하면 새로운 데이터가 반영되어 결과에 포함됩니다.(지연 실행)

보면 2번에서 정의를 했지만 3번 5번의 결과가 다름을 알 수 있다 

+)추가정보
원본 데이터의 특정 형식과 구조는 중요하지 않기에
어플리케이션에서는 소스 데이터가 항상 IEnumerable 또는 IQueryable 컬렉션으로 표시한다.
* IEnumerable: 열거할 수 있는 제네릭이 아닌 모든 컬렉션의 기본 인터페이스

쿼리 및 메서드 설명

설명
group 지정된 키 값에 따라 쿼리 결과를 그룹화합니다.
into join, group 또는 select 절의 결과에 대한 참조로 사용할 수 있는 식별자를 제공
orderby 요소 형식에 대한 기본 비교자에 따라 오름차순 또는 내림차순으로 쿼리 결과를 정렬
join 지정한 두 일치 조건 간의 같음 비교를 기반으로 하여 두 데이터 소스를 조인
ascending orderby 절의 키워드로 오름차순.
descending orderby 절의 키워드로 내림차순.

쿼리를 foreach를 돌리지 않고 결과를 저장하기 위한 메서드입니다

  • ToList :List<> 반환
  • ToArray : type[] 반환
  • ToDictionary :Dictionary<key,value> 반환
  • ToLookup :ILookup<Key,Element> 반환

2. 집계

  • Count: numbers.Count()를 호출하여 리스트의 항목 개수를 가져옵니다.
  • Sum: numbers.Sum()을 사용하여 리스트의 모든 숫자의 합계를 계산합니다.
  • Average: numbers.Average()로 평균을 계산합니다.
  • Max: numbers.Max()를 통해 최대값을 찾습니다.
  • Min: numbers.Min()을 통해 최소값을 찾습니다.

 

빠르게 예제코드를 보겠습니다.

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

class Program
{
    static void Main()
    {
        // 데이터 소스: 숫자 리스트
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };

        // Count: 항목의 개수
        int count = numbers.Count();
        Console.WriteLine($"개수: {count}"); // 결과: 6

        // Sum: 합계
        int sum = numbers.Sum();
        Console.WriteLine($"합계: {sum}"); // 결과: 21

        // Average: 평균
        double average = numbers.Average();
        Console.WriteLine($"평균: {average}"); // 결과: 3.5

        // Max: 최대값
        int max = numbers.Max();
        Console.WriteLine($"최대값: {max}"); // 결과: 6

        // Min: 최소값
        int min = numbers.Min();
        Console.WriteLine($"최소값: {min}"); // 결과: 1
    }
}

 

3. 집합 

 

  • 합집합 (Union): listA.Union(listB)를 통해 두 리스트의 모든 고유한 숫자를 결합합니다.
  • 교집합 (Intersect): listA.Intersect(listB)로 두 리스트의 공통 숫자를 찾습니다.
  • 차집합 (Except): listA.Except(listB)를 통해 listA에만 존재하는 숫자를 찾습니다.
  • 중복제거(Distinct) :리스트의 중복된 항목을 제거

 

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

class Program
{
    static void Main()
    {
        // 첫 번째 데이터 소스
        List<int> listA = new List<int> { 1, 2, 3, 4, 5 };
        // 두 번째 데이터 소스
        List<int> listB = new List<int> { 4, 5, 6, 7, 8 };

        // 합집합: listA와 listB의 모든 고유 항목
        var unionResult = listA.Union(listB);
        Console.WriteLine("합집합:");
        foreach (var item in unionResult)
        {
            Console.WriteLine(item); // 결과: 1, 2, 3, 4, 5, 6, 7, 8
        }

        // 교집합: listA와 listB의 공통 항목
        var intersectResult = listA.Intersect(listB);
        Console.WriteLine("\n교집합:");
        foreach (var item in intersectResult)
        {
            Console.WriteLine(item); // 결과: 4, 5
        }

        // 차집합: listA에서 listB에 없는 항목
        var exceptResult = listA.Except(listB);
        Console.WriteLine("\n차집합:");
        foreach (var item in exceptResult)
        {
            Console.WriteLine(item); // 결과: 1, 2, 3
        }
        
        
       List<int> dist = new List<int> { 1, 2, 2, 3, 4, 5, 5 };
        
        // 중복 제거: Distinct 메서드 사용
        var distinctNumbers  = dist.Distinct();
         foreach (var number in distinctNumbers)
        {
            Console.WriteLine(number); // 결과: 1, 2, 3, 4, 5
        }
    }
}

 


 [출처]

1. 쿼리

https://learn.microsoft.com/ko-kr/dotnet/csharp/linq/get-started/introduction-to-linq-queries

728x90

댓글