C# 루프 정리: LINQ SelectMany로 중첩 컬렉션 평탄화
Source: Dev.to
Introduction
리스트 안에 리스트가 있는 상황을 다루면서 데이터를 얻기 위해 복잡한 중첩 foreach 루프를 작성한 적이 있나요? C#에서는 .SelectMany 연산자를 사용하면 이러한 중첩 컬렉션을 평탄화하여 하나의 사용 가능한 스트림으로 만들 수 있는 우아한 방법을 제공합니다.
Traditional Approach
var allItems = new List();
foreach (var order in orders)
{
foreach (var item in order.LineItems)
{
allItems.Add(item);
}
}
이 방법도 동작하지만, 코드가 시끄럽고 한눈에 보기 어렵습니다.
Using SelectMany
var allItems = orders.SelectMany(o => o.LineItems).ToList();
SelectMany는 각 부모 객체에 들어가서 자식 컬렉션을 가져와 하나의 시퀀스로 펼쳐 줍니다.
Benefits
- Readability – 어떻게 루프를 돌릴지보다 무엇을 하고 싶은지를 명시합니다.
- Chainability –
.SelectMany뒤에 바로.Where(),.OrderBy()등 다른 LINQ 연산자를 추가해 데이터를 더 세밀하게 다듬을 수 있으며, 추가적인 루프를 작성할 필요가 없습니다.
루프 중심의 스타일에서 .NET의 보다 함수형 접근 방식으로 전환하고 있다면, SelectMany는 꾸준히 활용하게 될 도구입니다!