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
}
}
}
- 데이터 소스: numbers라는 리스트를 사용하고자 만들었습니다.
- 쿼리 정의: query 변수에 LINQ 쿼리를 정의합니다. 이 시점에서는 실제 데이터에 접근하지 않습니다.
- 쿼리 실행: foreach 문을 사용하여 쿼리를 실행하고 결과를 출력합니다. 이때 쿼리 조건에 맞는 데이터가 검색됩니다.
- 새로운 데이터 소스 :리스트에 새로운 숫자(8)를 추가
- 쿼리 실행: 쿼리를 다시 실행하면 새로운 데이터가 반영되어 결과에 포함됩니다.(지연 실행)
보면 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
'3.2 .net > C#' 카테고리의 다른 글
[C#]외부 DLL을 사용하는 DLLImport (0) | 2025.01.03 |
---|---|
[C#] using에 대해서 (0) | 2024.10.21 |
[C#] 두개의 Switch (스위치문, 스위치식) (0) | 2024.10.21 |
[C#] C#이벤트종류 (제가보려고 정리) (0) | 2024.10.08 |
[.net /C#] 대리자(delegate) (0) | 2024.09.19 |
댓글