Languague/C# / / 2025. 4. 2. 08:00

[C# LINQ] 중복된 값으로 리스트 묶기 – GroupBy 사용법(Group By 여러개)

300x250

 



LINQ를 에서 많이 사용되는 GroupBy는 sql과 비슷하고 실제로 데이터를 정리하거나 통계를 낼 때 GroupBy는 생각보다 훨씬 자주 사용된다.
같은 값을 가진 항목끼리 묶고 싶을 때, 예를 들어 같은 점수, 같은 연도, 같은 카테고리 등으로 데이터를 그룹화해야 할 때 LINQ의 GroupBy가 아주 유용하다.
 

GroupBy는 언제 쓰나?

  • 같은 점수를 받은 학생들끼리 묶고 싶을 때
  • 연도별로 날짜 데이터를 정리할 때
  • 상태 코드별로 로그를 정리하고 싶을 때
  • 같은 부서 소속 직원들을 나눌 때

즉, 리스트 안의 항목을 “같은 값 기준으로 묶고 싶을 때” 사용하는 게 바로 GroupBy다.
 


기본 문법

var grouped = 리스트.GroupBy(x => x.기준값);
  • grouped에는 "기준값(Key)"별로 나뉜 여러 개의 그룹이 생긴다.
  • 각 group는 group.Key와 그 안에 포함된 항목들을 가진다.

 

🤔 group.Key란?
그룹을 하나 꺼내보면:

foreach (var group in grouped)
{
    Console.WriteLine(group.Key);
    foreach (var item in group)
    {
        Console.WriteLine(" - " + item);
    }
}
  • group: 하나의 그룹 (예: 2022년생들)
  • group.Key: 해당 그룹의 기준값 (예: 2022)
  • group 안의 item들: 그 값으로 묶인 항목들

 

▶️ 쉽게 말해 group는 "라벨이 붙은 박스"이고, group.Key는 그 라벨, item들은 그 박스 안에 든 내용물이다.
 


예제

🔹 예제 1: 생년 기준으로 사람 묶기

public class Person
{
    public string Name { get; set; }
    public DateTime BirthDate { get; set; }
}

var people = new List<Person>
{
    new Person { Name = "홍길동", BirthDate = new DateTime(1990, 5, 1) },
    new Person { Name = "김영희", BirthDate = new DateTime(1990, 11, 21) },
    new Person { Name = "박철수", BirthDate = new DateTime(1985, 3, 15) }
};

var grouped = people.GroupBy(p => p.BirthDate.Year);

foreach (var group in grouped)
{
    Console.WriteLine($"{group.Key}년생:");
    foreach (var person in group)
    {
        Console.WriteLine($" - {person.Name}");
    }
}

 


🔹 예제 2: 문자열 날짜를 연도별로 묶기

var dates = new List<string>
{
    "2022-01-05", "2022-11-30",
    "2023-02-14", "2023-07-21",
    "2022-09-10"
};

var grouped = dates.GroupBy(d => d.Substring(0, 4));

foreach (var group in grouped)
{
    Console.WriteLine($"{group.Key}년:");
    foreach (var date in group)
    {
        Console.WriteLine($" - {date}");
    }
}

 


🔹 예제 3: GroupBy + Count로 그룹별 개수 세기

var items = new List<string>
{
    "A", "B", "A", "C", "B", "A"
};

var countByItem = items.GroupBy(i => i)
                       .Select(g => new { Item = g.Key, Count = g.Count() });

foreach (var entry in countByItem)
{
    Console.WriteLine($"{entry.Item} = {entry.Count}");
}

 

 

🔹 예제 4: GroupBy 두 개의 기준으로 묶기 (익명객체)

var orders = new List<(string Store, string Date)>
{
    ("A매장", "2023-01"),
    ("B매장", "2023-01"),
    ("A매장", "2023-02"),
    ("A매장", "2023-01")
};

var grouped = orders.GroupBy(x => new { x.Store, x.Date });

foreach (var group in grouped)
{
    Console.WriteLine($"{group.Key.Store} / {group.Key.Date} - {group.Count()}건");
}

 


📅 마무리

GroupBy는 데이터를 기준값으로 묶어서 보기 좋게 정리할 수 있는 기능이다. 이해 포인트는 "group.Key는 뭔지", "왜 반복문을 2번 쓰는지"만 잡아두면 금방 익숙해진다. LINQ에서 데이터를 분류하거나 통계 낼 일이 있다면, 가장 먼저 떠올려야 할 기능 중 하나다.
 
다음 편에서는 LINQ의 Join()을 활용해 두 리스트를 연결하는 방법을 정리해볼 예정!

300x250
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유