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