C#에서 LINQ와 람다식을 이용한 메모리 내 리스트 그룹화
C#에서 리스트 작업을 할 때, 특정 속성을 기준으로 항목을 그룹화해야 하는 다양한 시나리오를 마주할 수 있습니다. 예를 들어, Foo
객체의 컬렉션이 있고, 이를 Bar
속성의 값에 따라 정리하고 싶다고 가정해 봅시다. 이때 LINQ(언어 통합 쿼리)와 람다식의 힘이 필요합니다. 본 블로그 포스트에서는 이러한 C# 기능을 사용하여 메모리 내 리스트를 그룹화하는 방법을 효과적으로 탐구하겠습니다.
문제 이해하기
Bar
와 Lum
속성을 가진 Foo
객체 리스트가 있다고 가정해 보십시오. 일부 Foo
인스턴스는 같은 Bar
값을 가질 수 있습니다. 목표는 이러한 Foo
인스턴스들을 Bar
값으로 그룹화한 다음, 그룹화된 컬렉션을 반복하여 해당 Lum
값을 접근하는 것입니다. 이는 데이터 구성을 개선하고 특정 데이터 집합을 조작하기 쉽게 만들어 줍니다.
예제 시나리오
다음의 Foo
인스턴스 리스트로 구체적인 예를 고려해 보겠습니다:
var foos = new List<Foo> {
new Foo{Bar = 1,Lum = 1},
new Foo{Bar = 1,Lum = 2},
new Foo{Bar = 2,Lum = 3},
};
원하는 결과
우리는 이러한 Foo
인스턴스를 Bar
값으로 그룹화하고, 최종적으로 다음과 같은 결과를 얻고자 합니다:
Bar = 1
:Lum = 1
,Lum = 2
Bar = 2
:Lum = 3
LINQ를 이용한 해결 방법
LINQ의 group by
절을 사용하여 Foo
객체를 그룹화할 수 있습니다. 다음과 같이 구현할 수 있습니다:
var groupedFoos = from foo in foos
group foo by foo.Bar into grouped
let lums = from g in grouped
select g.Lum
select new { Bar = grouped.Key, Lums = lums };
단계 설명
- Group By:
group foo by foo.Bar
부분이Foo
인스턴스를Bar
속성을 기준으로 그룹화합니다. - Into Grouped: 이는 각 그룹을 위한 새로운 범위를 생성합니다.
- Lum 값 선택:
let lums
문장은 그룹화된 객체에서Lum
값으로 구성된 새로운 컬렉션을 생성할 수 있게 해줍니다. - 최종 선택: 최종 선택은
Bar
값과 해당하는Lum
값 리스트를 포함한 새로운 객체로 모든 것을 조합합니다.
람다식을 이용한 해결 방법
또는 람다식을 사용하여 동일한 결과를 얻을 수 있습니다. 이는 더 간결한 구문을 제공할 수 있습니다. 방법은 다음과 같습니다:
var groupedFoos = foos.GroupBy(x => x.Bar)
.Select(y => new { Bar = y.Key, Lums = y.Select(z => z.Lum) });
작동 원리
- GroupBy: 이 메소드는 그룹화할 속성을 지정하기 위해 람다 함수를 사용합니다, 즉
x.Bar
입니다. - Select: 그룹화 후, 각 그룹에 대해
Bar
와 해당하는Lum
값이 포함된 새로운 익명 객체를 생성하기 위해Select
를 사용합니다.
그룹화된 데이터 반복하기
LINQ든 람다식이든 관계없이, 그룹화된 데이터를 반복하는 방식은 동일합니다. 각 그룹을 순회하고 Lum
값을 출력할 수 있습니다:
foreach (var group in groupedFoos)
{
Console.WriteLine("Lums for Bar#" + group.Bar);
foreach (var lum in group.Lums)
{
Console.WriteLine(lum);
}
}
출력 결과:
Lums for Bar#1
1
2
Lums for Bar#2
3
결론
C#에서 LINQ 또는 람다식을 사용하여 메모리 내 리스트를 그룹화하는 것은 데이터를 조직하는 강력한 방법입니다. LINQ 구문이 더 읽기 쉬운지, 또는 람다식의 간결함을 선호하는지에 상관없이, 두 가지 접근 방식을 통해 원하는 데이터 그룹화를 효과적으로 달성할 수 있습니다.
LINQ에 대한 이해를 깊이 하고 싶다면, 101 LINQ Samples를 탐색해 더 포괄적인 예제를 확인해 보세요.
질문이 있거나 C#에서 데이터 그룹화에 대한 경험을 공유하고 싶다면, 아래에 댓글을 남겨 주세요!