다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다.
C# 컴파일러는 LINQ의 쿼리 표현식과 메서드 호출 구문으로 변환한다.
C#은 쿼리 표현식 패턴에 포함된 개별 메서드의 의미를 전혀 개의치 않는다.
Where
필터 이상의 역할을 수행하지 않는다.
where n < 5
numbers.Where(n => n < 5);
Select
입력값을 다른 타입으로 변환하는 용도로 사용된다.
입력 시퀀스 내의 개별 요소에 대해 각기 새로운 타입의 객체를 생성하여 출력 시퀀스로 내보내지만 요소들을 수정해서는 안된다.
var squares = from n in numbers
select new { Number = n, Square = n * n };
var squares = numbers.Select(n =>
new { Number = n, Square = n * n });
OrderBy, ThenBy
입력값을 정렬한다.
var people = from e in employees
where e.Age > 30
orderby e.LastName, e.FirstName, e.Age
select e;
var people = employees.Where(e => e.Age > 30).
OrderBy(e => e.LastName).
ThenBy(e => e.FirstName).
ThenBy(e => e.Age);
orderby절을 각각 쓰면 ThenBy가 아니라 OrderBy를 각각 실행돼버려서 앞 두 개는 의미 없어지니 주의.
var people = from e in employees
where e.Age > 30
orderby e.LastName
orderby e.FirstName
orderby e.Age
select e;
var people = employees.Where(e => e.Age > 30).
OrderBy(e => e.LastName).
OrderBy(e => e.FirstName).
OrderBy(e => e.Age);
내림차순 정렬은 다음과 같이 지정할 수 있다.
var people = from e in employees
where e.Age > 30
orderby e.LastName decending, e.FirstName, e.Age
select e;
group into
개별 요소로 하나의 키와 값의 리스트를 쌍으로 갖는 시퀀스를 생성한다.
var results = from e in employees
group e by e.Department into d
select new
{
Department = d.Key,
Size = d.Count()
};
우선 변환작업에 앞서 group into 구문을 중첩쿼리로 변환한다.
var results = from d in
from e in employees group e by e.Department
select new {
Department = d.Key,
Size = d.Count()};
이를 메서드 호출 구문으로 변환한다.
var results = employees.GroupBy(e => e.Department).
Select(d => new { Department = d.Key, Size = d.Count() });
결론
- 쿼리표현식이 메서드 호출 구문으로 변환되는 과정을 알아둔다면
사용자 정의 공급자를 만들어볼 수도 있다.
'🌍 C# Study > 이펙티브 C#' 카테고리의 다른 글
[38] 메서드보다 람다 표현식이 낫다 (0) | 2021.05.02 |
---|---|
[37] 쿼리를 사용할 때는 즉시 평가보다 지연 평가가 낫다 (0) | 2021.05.02 |
[35] 확장 메서드는 절대 오버로드하지 마라 (0) | 2021.04.30 |
[34] 함수를 매개변수로 사용하여 결합도를 낮추라 (0) | 2021.04.30 |
[33] 필요한 시점에 필요한 요소를 생성하라 (0) | 2021.04.30 |