오늘은 c#에서 LINQ를 공부해보려한다.
c#에서 데이터를 쿼리하고 조작할 때 개발자들은 종종 루프나 조건문 등
복잡한 논리를 작성해야하지만 c#에서는 이러한 작업들을 간소화하는
LINQ(Language-Intergrated Query) 라는 기능을 제공한다.
1. LINQ란?
LINQ(Language-Intergrated Query)는 다양한 데이터 소스를 쿼리하고 조작하기 위한 일관되고
직관적인 방법을 제공하는 c#의 언어 확장 집합이다. LINQ를 사용하면 친숙한 SQL 유사 구문 또는
메서드 기반 접근 방식을 사용하여 개체, 컬렉션, 데이터베이스, XML 등을 쿼리할 수 있다.
2. LINQ의 이점은?
- 가독성과 표현력 : LINQ는 복잡한 데이터 작업을 간결하고 선언적인 방식으로 표현할 수 있도록 하여
코드를 단순화하고 가독성을 향상시킨다. - 타입 안정성 및 컴파일 검사 : LINQ의 중요한 장점 중 하나는 C# 유형 시스템과의 통합이다.
즉 컴파일 타임 검사를 통해 쿼리가 유효하고 형식이 안전한지 확인할 수 있다. 이는 개발 프로세스 초기에 오류를
포착하여 런탕미 예외를 줄이는 데 도움이 된다. - 코드 재사용성 : LINQ를 사용하면 쿼리를 한 번 작성하고 여러 데이터 소스에서 재사용이 가능하다.
이는 코드 재사용성을 촉진하고 중복성을 줄이며 유지 관리성을 향상시킨다. 또한 LINQ 쿼리는 메서드 또는
속성으로 쉽게 캡슐화되어 모듈식 및 조직화된 코드를 사용할 수 있다. - C#과의 원활한 통합: 언어 확장으로서 LINQ는 나머지 C# 언어와 원활하게 통합된다. LINQ를 람다 식, 익명 형식 및 예외 처리와 같은 다른 언어 기능과 결합할 수 있다. 이 시너지를 통해 표현력 있고 효율적인 코드를 작성하여 복잡한 데이터 작업을 쉽게 처리할 수 있다.
3. LINQ 사용법
LINQ는 쿼리 구문과 매서드 구문이라는 2가지 구문 스타일을 제공한다. 쿼리 구문은 SQL과 유사하며 데이터 쿼리에 대한
선언적 접근방식을 제공하는 반면 메서드 구문은 메서드 체인을 사용하여 동일한 결과를 얻을 수 있다.
- from - 어떤 데이터에서 원하는 값을 추출할 것인지
- where - 원하는 값을 추출하기 위한 조건
- select - 데이터에서 어떤 항목을 추출할 것인지
// Query 구문
var querySyntaxResult = from number in numbers
where number % 2 == 0
orderby number descending
select number;
// Method 구문
var methodSyntaxResult = numbers
.Where(number => number % 2 == 0)
.OrderByDescending(number => number)
.Select(number => number);
예제 2 : 데이터 필터링 및 정렬
데이터를 필터링하면 특정 조건과 일치하는 특정 요소를 추출할 수 있으며 정렬은 데이터를 특정 순서로 정렬도 가능하다.
LINQ에서는 Where() 메서드를 사용하여 필터링을 수행하고 OrderBy() 및 OrderByDescending()을 사용하여 정렬을 수행할 수 있다.
var numbers = new List<int> { 10, 7, 4, 15, 21, 30, 18 };
// Filtering data using Where()
var evenNumbers = numbers.Where(number => number % 2 == 0);
// Sorting data using OrderBy() and OrderByDescending()
var sortedNumbers = numbers.OrderBy(number => number);
var descendingNumbers = numbers.OrderByDescending(number => number);
예제 3:데이터 결합 및 그룹화
LINQ는 서로 다른 소스의 데이터를 결합하고 그룹화하는 메커니즘을 제공한다.
Join() 및 GroupJoin() 매서드를 사용하면 공통 키를 기반으로 데이터를 조인할 수 있으며, GroupBy() 메서드를 사용하면
특정 기준에 따라 그룹화 할 수도 있다.
// Joining data using Join() and GroupJoin()
var joinedData = from employee in employees
join department in departments on employee.DepartmentId equals department.Id
select new { employee.Name, department.Name };
var groupedData = from employee in employees
join department in departments on employee.DepartmentId equals department.Id into groupedDepartments
select new { employee.Name, Departments = groupedDepartments };
// Grouping data using GroupBy()
var groupedEmployees = employees.GroupBy(employee => employee.DepartmentId);
예제3 : 집계 및 집합 연산
LINQ는 데이터 집계 및 집합 작업 수행을 위한 메서드 또한 제공한다. Count(), Sum(), Average(), Min() 및 Max()
매서드를 사용하면 특정 기준에 따라 집계 값을 계산할 수 있다. 또한 Union(), Intersect(), Except() 및 Distinct() 메서드를 사용하면 컬렉션에서 설정 작업을 수행할 수 있다.
// Aggregate calculations using Count(), Sum(), Average(), Min(), Max()
var count = numbers.Count();
var sum = numbers.Sum();
var average = numbers.Average();
var min = numbers.Min();
var max = numbers.Max();
// Perform set operations using Union(), Intersect(), Except(), and Distinct()
var unionResult = numbers1.Union(numbers2);
var intersectResult = numbers1.Intersect(numbers2);
var exceptResult = numbers1.Except(numbers2);
var distinctResult = numbers.Distinct();
- Union() : 두 컬렉션을 결합하고 두 소스의 고유한 요소를 포함하는 새 컬렉션을 반환 - 중복 제거
- Intersect() : 두 컬렉션 간 공통 요소를 포함하는 새 컬렉션 반환
- Except() : 두 컬렉션에 존재하지 않는 첫번째 컬렉션의 요소를 포함하는 새 컬렉션 반환 -공통요소 제외
- Distinct() : 단일 컬렉션의 고유한 요소들만 반환 - 중복 제거
LINQ를 마스터하게 되면 컬렉션, 배열 , 데이터베이스 및 xml을 비롯한 다양한 소스의 데이터를 효율적으로 조작할 수 있다. LINQ를 사용하면 개발 프로세스를 간소화하고 코드 가독성을 높이며 생상선을 높일 수 있다.
'프로그래밍 언어 및 IT 정보 > C#' 카테고리의 다른 글
c# 대리자(Delegate)와 이벤트(Event) 개념잡기 (0) | 2023.06.04 |
---|---|
c# Queue / Stack -자료구조 (0) | 2023.06.01 |
c# Generics(제네릭) 이란 (2) | 2023.05.31 |
MVVM란 ? 디자인패턴에 대해서 (0) | 2021.09.14 |