Select() 메서드
객체에 담긴 여러 데이터 중에서 원하는 부분만 손쉽게 추출하여 새로운 형태의 컬렉션으로 생성한다.
public class Program
{
public class Winner
{
public string name;
public int[] years;
}
public static void Main()
{
List<Winner> list = new()
{
new Winner() { name = "Boston", years = new [] { 1989, 1999 } },
new Winner() { name = "Yankees", years = new [] { 2000, 2012, 2013, 2018 } },
new Winner() { name = "Newyork", years = new [] { 1934, 2021, 2022 } },
};
List<string> teamName = list.Select(l => l.name).ToList();
teamName.ForEach(c => Console.WriteLine(c));
}
}
원하는 팀 이름을 뽑았다. 하지만 출력하려는 컬렉션이 배열이라면 복잡한 상황이 발생한다.
public class Program
{
public class Winner
{
public string name;
public int[] years;
}
public static void Main()
{
List<Winner> list = new()
{
new Winner() { name = "Boston", years = new [] { 1989, 1999 } },
new Winner() { name = "Yankees", years = new [] { 2000, 2012, 2013, 2018 } },
new Winner() { name = "Newyork", years = new [] { 1934, 2021, 2022 } },
};
List<int[]> years = list.Select(l => l.years).ToList();
years.ForEach(c => Console.WriteLine(c));
}
}
public class Program
{
public class Winner
{
public string name;
public int[] years;
}
public static void Main()
{
List<Winner> list = new()
{
new Winner() { name = "Boston", years = new[] { 1989, 1999 } },
new Winner() { name = "Yankees", years = new[] { 2000, 2012, 2013, 2018 } },
new Winner() { name = "Newyork", years = new[] { 1934, 2021, 2022 } },
};
List<int[]> years = list.Select(l => l.years).ToList();
foreach(var array in years)
{
foreach(var c in array)
{
Console.WriteLine(c);
}
}
}
}
2중 for문으로 작성해야지 정상적으로 출력이 된다.
SelectMany() 메서드
selectmany를 사용하면 리스트 안의 리스트를 평탄화한다.
public class Program
{
public class Winner
{
public string name;
public int[] years;
}
public static void Main()
{
List<Winner> list = new()
{
new Winner() { name = "Boston", years = new [] { 1989, 1999 } },
new Winner() { name = "Yankees", years = new [] { 2000, 2012, 2013, 2018 } },
new Winner() { name = "Newyork", years = new [] { 1934, 2021, 2022 } },
};
var years = list.SelectMany(l => l.years).ToList();
years.ForEach(c => Console.WriteLine(c));
}
}
selectmany로 평탄화되어서 2중 for문을 사용하지 않아도 된다.
SelectMany() 메서드 두 번째 예시
public class Program
{
public class Winner
{
public string name;
public int[] years;
}
public static void Main()
{
List<Winner> list = new()
{
new Winner() { name = "Boston", years = new [] { 1989, 1999 } },
new Winner() { name = "Yankees", years = new [] { 2000, 2012, 2013, 2018 } },
new Winner() { name = "Newyork", years = new [] { 1934, 2021, 2022 } },
};
var years = list.SelectMany(l => l.years, (l, y) => new { name = l.name, years = y}).ToList();
years.ForEach(c => Console.WriteLine(c));
}
}
보다 복잡한 형태로 컬렉션을 만들어서 출력할 수 있다.
SelectMany() 메서드 구현 예제
static IEnumerable<TOutput> SelectMany<T1, T2, TOutput>(
this IEnumerable<T1> src,
Func<T1, IEnumerable<T2>> inputSelector,
Func<T1, T2, TOutput> resultSelector)
{
foreach (T1 first in src)
{
foreach (T2 second in inputSelector(first))
{
yield return resultSelector(first, second);
}
}
}
함께 읽으면 좋은 글
'프로그래밍 > C# LINQ' 카테고리의 다른 글
C# Linq - Enumerable.Range() (0) | 2023.12.18 |
---|---|
C# Linq - Enumerable.Aggregate() (19) | 2023.06.26 |
C# Linq - Enumerable.OrderBy() (26) | 2023.06.20 |
C# Linq - Enumerable.Repeat() (26) | 2023.06.13 |
C# Linq - Enumerable.Join() (12) | 2023.04.20 |
댓글