무효 클릭 IP 추적 중...
c#

[c# Linq] Select vs SelectMany 차이

꼬예 2023. 3. 20.
[c# Linq] Select vs SelectMany 차이

LINQ 예제 코드를 보면   Select  ,   SelectMany  가 빈번히 사용된다.

알면 쉽지만 헷갈리기 시작하면 한없이 헷갈린다.

 

이번 포스팅을 통해 확실하게 개념을 정리해보자.

 

예제용 리스트 생성

월드컵 우승 국가와 연도를 담은 리스트다.

List<Winner> list = new()
{
            new Winner() { Country = "Argentina", Years = new[] { 1978, 1986, 2022 } },
            new Winner() { Country = "England  ", Years = new[] { 1966 } },
            new Winner() { Country = "Germany  ", Years = new[] { 1954, 1974, 1990, 2014 } },
};

 

Select 사용 예시

List<string> countries = list.Select(w => w.Country).ToList();
countries.ForEach(c => Console.WriteLine(c));

//output
Argentina
England
Germany

복잡한 객체가 담긴 리스트에서 원하는 부분을 손쉽게 추출하여 새로운 형태의 컬렉션을 생성한다.

(기존 컬렉션에 영향 X)

 

그런데!  뽑으려는 속성값이 배열이라면   Select  는 번거롭다.

List<int[]> listOfArrays = list.Select(w => w.Years).ToList();
listOfArrays.ForEach(y => Console.WriteLine(y));

//output
System.Int32[]
System.Int32[]
System.Int32[]

 

배열 안에 있는 값은 보이지 않고 타입명만 출력되기 때문이다.

 

해당 값들을 읽기 위해선 이중 for loop를 이용해야 한다. 상당히 번거롭다.

이때   SelectMany  를 사용하면 편리하다.

 

SelectMany 사용 예시

1) 파라미터 1개 있을 경우 

List<int> aggregatedList = list.SelectMany(w => w.Years).ToList();
aggregatedList.ForEach(y => Console.WriteLine(y));

//output
1978
1986
2022
1966
1954
1974
1990
2014

  이중 for loop   없이 리스트 안에 값을 풀어 하나의 컬렉션으로 만든다.

 

하지만 이렇게 풀어 헤치기만 하면 어느 국가에 우승 연도인지 파악이 안된다. 

이때 파라미터 2개를 사용하면 문제를 해결할 수 있다.

 

2) 파라미터 2개 있을 경우 

var customList = list.SelectMany(w => w.Years, (w, y) => new { Country = w.Country, Year = y}).ToList();

복잡하고 낯선 형태다. 하나씩 분석해 보자.

 

w정체

  w    Winner  객체가 넘어오는 자리다.

 

y의 정체

  w => w.Years  를 통해 풀어헤친   Year 배열    y  로 통과된다.

 

그럼 새롭게 생성된   new { Country = w.Country, year =y }    는 어떤 모습일까?

[c# Linq] Select vs SelectMany 차이 - undefined - SelectMany 사용 예시

 

결과는 아래와 같다.

customList.ForEach(e => Console.WriteLine(e));

//output
{ Country = Argentina, Year = 1978 }
{ Country = Argentina, Year = 1986 }
{ Country = Argentina, Year = 2022 }
{ Country = England  , Year = 1966 }
{ Country = Germany  , Year = 1954 }
{ Country = Germany  , Year = 1974 }
{ Country = Germany  , Year = 1990 }
{ Country = Germany  , Year = 2014 }

 

결과를 보면 어떻게 동작하는지 감이 올 거다.

 

 

이 글과 읽으면 좋은글

 

 

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글

꼬예님의
글이 좋았다면 응원을 보내주세요!