C# LINQ 연산자 소개
LINQ 연산자 개요
연산자 분류
- LINQ 연산자는 세 가지 범주로 분류됨.
- 시퀀스 입력, 시퀀스 출력 (sequence→sequence)
- 시퀀스 입력, 단일 요소 또는 스칼라 값 출력
- 입력 없음, 시퀀스 출력 (생성 메서드)
시퀀스→시퀀스 연산자
- 데이터 구조
- 관계형 (Relational):
- 테이블과 테이블 간 관계로 표현.
- SQL 데이터베이스에서 흔히 사용.
- 데이터 분산 저장 및 조인 연산으로 연결.
- 계층적 (Hierarchical):
- 트리 구조로 표현.
- 부모-자식 관계.
- XML, JSON 등에서 자주 사용.
- 플랫 (Flat):
- 모든 데이터가 하나의 컬렉션에 포함.
- 중첩 구조 없음.
- 배열, 리스트 형태로 표현.
- 관계형 (Relational):
- 변환 방법
- 관계형 → 플랫:
- SelectMany: 여러 컬렉션을 하나로 평탄화. (예: 고객 목록 + 각 고객의 주문 목록 → 모든 주문 목록)
- Join: 공통 속성을 기준으로 두 개 이상 컬렉션 연결. (예: 고객 테이블 ⋈ 주문 테이블 → 고객 정보 + 주문 정보)
- 관계형 → 계층적:
- 서브쿼리 (Select-subquery): 다른 쿼리 내부에 포함된 쿼리 사용. (예: 각 고객에 대한 주문 목록을 서브쿼리로 가져옴)
- GroupJoin: 두 컬렉션 연결 후 오른쪽 컬렉션 요소들을 왼쪽 컬렉션 요소에 그룹화. (예: 고객 테이블 ▷◁ 주문 테이블 → 각 고객에 대한 주문 목록 그룹)
- 계층적 → 플랫:
- SelectMany: 계층 구조를 평탄화.
- Group: 특정 속성 기준으로 요소 그룹화 후 각 그룹 요소들을 하나의 컬렉션으로 가져옴.
- 플랫 → 계층적:
- 서브쿼리 또는 Group 사용. (예: 상품 목록을 카테고리별로 그룹화)
- 관계형 → 플랫:
- 주요 LINQ 연산자
- SelectMany: 컬렉션 평탄화.
- 여러개의 시퀀스를 받아 하나의 시퀀스로 반환하는 연산자다.
- Join: 컬렉션 연결.
- 서브쿼리: 쿼리 내 쿼리.
- GroupJoin: 그룹화된 조인.
- Group: 요소 그룹화.
- SelectMany: 컬렉션 평탄화.
기능 분류 메서드 설명
| 필터링 (Filtering) | Where | 주어진 조건에 맞는 요소만 반환함 |
| Take | 시퀀스의 시작부터 지정된 개수의 요소만 반환함 | |
| TakeLast | 시퀀스의 끝에서부터 지정된 개수의 요소만 반환함 | |
| TakeWhile | 주어진 조건을 만족하는 동안의 요소만 반환함 | |
| Skip | 시퀀스의 시작부터 지정된 개수의 요소를 건너뜀 | |
| SkipLast | 시퀀스의 끝에서부터 지정된 개수의 요소를 건너뜀 | |
| SkipWhile | 주어진 조건을 만족하는 동안의 요소를 건너뜀 | |
| Distinct | 중복된 요소를 제거함 | |
| DistinctBy | 지정된 키 선택기를 사용하여 중복된 요소를 제거함 | |
| 투영 (Projecting) | Select | 각 요소를 람다 함수를 사용하여 새로운 형태로 변환함 |
| SelectMany | 중첩된 시퀀스를 하나의 평면화된 시퀀스로 변환함 | |
| 조인 (Joining) | Join | 두 시퀀스의 요소를 지정된 조건에 따라 내부 조인함 |
| GroupJoin | 두 시퀀스의 요소를 지정된 조건에 따라 그룹 조인함 | |
| Zip | 두 시퀀스의 동일한 인덱스에 있는 요소를 쌍으로 묶음 | |
| 정렬 (Ordering) | OrderBy | 오름차순으로 요소를 정렬함 |
| OrderByDescending | 내림차순으로 요소를 정렬함 | |
| ThenBy | OrderBy 또는 OrderByDescending 이후 추가 정렬 조건을 지정함 (오름차순) | |
| ThenByDescending | OrderBy 또는 OrderByDescending 이후 추가 정렬 조건을 지정함 (내림차순) | |
| Reverse | 시퀀스의 요소 순서를 반전함 | |
| 그룹화 (Grouping) | GroupBy | 지정된 키 선택기를 기준으로 요소를 그룹화함 |
| Chunk | 시퀀스를 지정된 크기의 청크(하위 시퀀스)로 분할함 | |
| 집합 연산자 (Set operators) | Concat | 두 시퀀스를 연결함 |
| Union | 두 시퀀스의 합집합을 반환함 (중복 제거) | |
| UnionBy | 지정된 키 선택기를 사용하여 두 시퀀스의 합집합을 반환함 (중복 제거) | |
| Intersect | 두 시퀀스의 교집합을 반환함 | |
| IntersectBy | 지정된 키 선택기를 사용하여 두 시퀀스의 교집합을 반환함 | |
| Except | 첫 번째 시퀀스에는 있지만 두 번째 시퀀스에는 없는 요소를 반환함 (차집합) | |
| ExceptBy | 지정된 키 선택기를 사용하여 첫 번째 시퀀스에는 있지만 두 번째 시퀀스에는 없는 요소를 반환함 (차집합) |
시퀀스→요소 또는 값 연산자
기능 분류 메서드 설명
| 요소 연산자 (Element operators) | First | 시퀀스의 첫 번째 요소를 반환함. |
| FirstOrDefault | 시퀀스의 첫 번째 요소를 반환하거나, 시퀀스가 비어 있는 경우 기본값을 반환함. | |
| Last | 시퀀스의 마지막 요소를 반환함. | |
| LastOrDefault | 시퀀스의 마지막 요소를 반환하거나, 시퀀스가 비어 있는 경우 기본값을 반환함. | |
| Single | 시퀀스의 유일한 요소를 반환함. 시퀀스에 요소가 없거나 두 개 이상인 경우 예외를 발생시킴. | |
| SingleOrDefault | 시퀀스의 유일한 요소를 반환하거나, 시퀀스가 비어 있는 경우 기본값을 반환함. 시퀀스에 두 개 이상의 요소가 있는 경우 예외를 발생시킴. | |
| ElementAt | 지정된 인덱스에 있는 요소를 반환함. | |
| ElementAtOrDefault | 지정된 인덱스에 있는 요소를 반환하거나, 인덱스가 범위를 벗어난 경우 기본값을 반환함. | |
| 집계 메서드 (Aggregation methods) | Aggregate | 시퀀스의 모든 요소에 누적 함수를 적용함. |
| Average | 시퀀스 요소의 평균값을 계산함. | |
| Count | 시퀀스에 있는 요소의 개수를 반환함. | |
| LongCount | 시퀀스에 있는 요소의 개수를 long 형식으로 반환함. | |
| Sum | 시퀀스 요소의 합계를 계산함. | |
| Max | 시퀀스 요소의 최대값을 반환함. | |
| Min | 시퀀스 요소의 최소값을 반환함. | |
| 수량자 (Quantifiers) | All | 시퀀스의 모든 요소가 지정된 조건을 만족하는지 확인함. |
| Any | 시퀀스에 하나 이상의 요소가 지정된 조건을 만족하는지 확인함. | |
| Contains | 시퀀스에 지정된 요소가 포함되어 있는지 확인함. | |
| SequenceEqual | 두 시퀀스가 동일한지 확인함. |
void→시퀀스 연산자
기능 분류 메서드 설명
| 생성 메서드 (Generation methods) | Empty | 요소가 없는 빈 시퀀스를 생성함. |
| Range | 지정된 범위 내의 정수 시퀀스를 생성함. | |
| Repeat | 지정된 값을 지정된 횟수만큼 반복하는 시퀀스를 생성함. |
요약
- 게임 프로그래밍할때는 실시간으로 동작하는 곳에는 사용하지 말아야한다.
- 요령껏 써라
'공부 > C#' 카테고리의 다른 글
| 파일 입출력, 유니티 파일 입출력, Using Streams, MemoryStream, Path (0) | 2025.09.09 |
|---|---|
| LINQ 하위 쿼리, let 키워드 (0) | 2025.09.09 |
| LINQ 질의식, LINQ 지연 실행 (0) | 2025.09.09 |
| 쿼리 연산자 체이닝, 지연 실행의 장점 (0) | 2025.09.09 |
| LINQ, 쿼리 연산자, 람다 식 (0) | 2025.09.09 |