C#컬렉션과 LINQ

LINQ GroupBy, Join, projection

여러 컬렉션을 연결하고 집계한 뒤 원하는 모양으로 내보내는 LINQ의 `GroupBy`, `Join`, projection 패턴을 정리합니다.

마지막 수정 2026년 3월 22일

기본 패턴

csharp
var result = players
    .Join(
        teams,
        player => player.TeamId,
        team => team.Id,
        (player, team) => new { player.Name, TeamName = team.Name })
    .GroupBy(item => item.TeamName)
    .Select(group => new
    {
        Team = group.Key,
        Members = group.Select(item => item.Name).ToList()
    });

설명

  • LINQ의 진짜 힘은 단순 필터링보다 "여러 데이터 소스를 연결하고, 묶고, 원하는 결과 모양으로 투영한다"는 데 있습니다. 이때 핵심이 Join, GroupBy, projection입니다.
  • Join은 두 시퀀스를 키 기준으로 연결합니다. SQL과 비슷하게 읽을 수 있지만, 실제로는 컬렉션 연산이므로 언제 메모리에서 수행되는지와 비용도 함께 생각해야 합니다.
  • GroupBy는 키 기준으로 여러 항목을 묶어 그룹 단위로 다루게 해 줍니다. 집계뿐 아니라 "팀별 멤버 목록", "상태별 항목 묶음"처럼 계층적 결과를 만들 때도 자주 쓰입니다.
  • projection은 Select로 결과 모양을 재설계하는 과정입니다. 원본 객체를 그대로 끌고 가기보다, 지금 단계에 필요한 데이터만 새 익명 타입이나 DTO로 바꾸는 감각이 중요합니다.
  • 이 세 가지를 같이 이해하면 LINQ는 단순 문법이 아니라 "데이터를 단계적으로 재구성하는 언어"처럼 보이기 시작합니다. 그래서 컬렉션 처리와 보고서용 데이터 가공이 훨씬 자연스러워집니다.

빠른 정리

연산역할
Join두 시퀀스 연결
GroupBy키 기준 묶기
Select결과 모양 재설계
projection필요한 데이터만 새 형태로 내보내기
잘 맞는 곳리포트, 화면 모델, 집계 데이터

주의할 점

LINQ 체인이 길어질수록 원본 타입과 현재 결과 타입이 계속 바뀝니다. projection 단계마다 "지금 결과가 어떤 모양인가"를 의식하지 않으면 쿼리가 짧아 보여도 읽기가 급격히 어려워질 수 있습니다.

참고 링크

2 sources