300x250

LINQ를 사용하다 보면 Select()는 익숙하지만, SelectMany()는 처음 보면 "이건 언제 쓰는 거지?" 싶은 경우가 있다. 두 메서드는 비슷해 보여도 동작 방식이 다르기 때문에 한 번 제대로 정리해두면 나중에 헷갈릴 일이 없다. 이번 글에서는 Select와 SelectMany의 차이를 실제 예제와 함께 비교하고, 언제 어떤 걸 써야 하는지 정리해봤다.
📚 목차
- Select와 SelectMany란?
- 기본 구조 비교
- 실전 예제 비교
- 언제 Select, 언제 SelectMany?
1. Select와 SelectMany란?
Select()는 컬렉션(List, 배열 등)의 각 항목을 원하는 형태로 가공해서 반환할 때 사용한다. SelectMany()는 각 항목에서 여러 개의 값을 뽑아와서, 전부 하나로 합쳐서 반환하고 싶을 때 사용한다.
Select()
→ 항목 하나 → 결과 하나SelectMany()
→ 항목 하나 → 결과 여러 개 → 모두 한 리스트로 합치기
2. 기본 구조 비교
// Select
var result = items.Select(item => item.Property);
// SelectMany
var result = items.SelectMany(item => item.PropertyList);
Select()는 하나를 하나로 바꾸는 것
SelectMany()는 "리스트 안에 있는 값들"을 쭉 펼쳐서 하나로 만든다는 느낌
3. 실전 예제 비교
예제: 학생 목록 안에 과목 리스트가 있는 구조
public class Student
{
public string Name { get; set; }
public List<string> Subjects { get; set; }
}
var students = new List<Student>
{
new Student { Name = "철수", Subjects = new List<string> { "수학", "과학" } },
new Student { Name = "영희", Subjects = new List<string> { "국어", "영어" } }
};
✅ Select 사용
var subjectLists = students.Select(s => s.Subjects);
foreach (var subjectList in subjectLists)
{
foreach (var subject in subjectList)
{
Console.WriteLine(subject); // 수학, 과학, 국어, 영어
}
}
Select
를 쓰면 List<List<string>>
형태가 되기 때문에 이중 반복문이 필요하다.
✅ SelectMany 사용
var allSubjects = students.SelectMany(s => s.Subjects);
foreach (var subject in allSubjects)
{
Console.WriteLine(subject); // 수학, 과학, 국어, 영어
}
SelectMany
는 안에 있는 리스트들을 한 줄로 펼쳐서 하나의 리스트로 만들어준다.
4. 언제 Select? 언제 SelectMany?
상황 | 추천 메서드 | 이유 |
---|---|---|
단순 값 가공 | Select() |
이름 변경, 속성 추출 등 1:1 매핑 |
리스트 안의 리스트를 한 줄로 만들기 | SelectMany() |
중첩된 컬렉션을 하나로 펼칠 때 |
DB 쿼리에서 JOIN 느낌 | SelectMany() |
하위 데이터까지 한 번에 조회 |
Select()
는 각각의 항목을 가공할 때, SelectMany()
는 안에 있는 리스트나 여러 값을 하나로 모아야 할 때 사용한다.
두 개가 비슷해 보여도 동작 방식이 다르기 때문에 한 번 개념을 정확히 정리해두면 나중에 LINQ 쓸 때 훨씬 편하다.
300x250
'Languague > C#' 카테고리의 다른 글
[C# LINQ] 중복된 값으로 리스트 묶기 – GroupBy 사용법(Group By 여러개) (0) | 2025.04.02 |
---|---|
[C# LINQ] Where 사용법 완전 정리 - 조건 필터링, 리스트 추출, 예제까지 (0) | 2025.03.31 |
[C#] 람다식(Lambda Expression)이란? (익명 함수, 델리게이트, => 사용법) (0) | 2025.03.30 |
[C#] Any(), All(), Exists() 사용법 요소 null 체크 (2) | 2024.03.14 |
[C#] LINQ First, FirstOfDefault 사용법 첫번째 요소 가져오기 (1) | 2024.03.12 |