두 List 를 번갈아서 섞는 방법입니다.
2가지 방법이 있습니다.
첫번째 방법은 linq 를 이용해 아래와 같이 처리합니다.
var list1 = new List<int> { 1, 3, 5 };
var list2 = new List<int> { 2, 4, 6 };
// 두 리스트를 번갈아 합치기
var combined = list1
.Select((item, index) => new { Item1 = item, Item2 = list2.ElementAtOrDefault(index) })
.SelectMany(pair => new int?[] { pair.Item1, pair.Item2 })
.ToList();
combined.ForEach(item => Console.WriteLine(item));
결과
두번째 방법은 Linq Zip 을 이용하여 처리하는 방법입니다.
var zipped = list1.Zip(list2, (first, second) => new[] { first, second }).SelectMany(pair => pair).ToList();
zipped.ForEach(item => Console.WriteLine(item));
결과는 첫번째 결과와 동일합니다.
Zip 메소드는 두 시퀀스(컬렉션)의 요소들을 한 쌍씩 짝지어주는 역할을 합니다. 각 쌍의 요소는 주어진 함수를 통해 새로운 형태로 변환될 수 있습니다. 이 메소드는 두 컬렉션을 동시에 순회하며, 더 짧은 컬렉션의 길이에 맞춰 실행됩니다. 즉, 두 컬렉션 중 하나의 끝에 도달하면 작업이 종료됩니다.
Zip 메소드의 기본 시그니처는 다음과 같습니다:
public static IEnumerable Zip<TFirst, TSecond, TResult>(
this IEnumerable first,
IEnumerable second,
Func<TFirst, TSecond, TResult> resultSelector)
여기서 TFirst와 TSecond는 각각 첫 번째와 두 번째 시퀀스의 요소 타입을 나타내고, TResult는 결과 시퀀스의 요소 타입을 나타냅니다. resultSelector 함수는 각 쌍의 요소에 적용되어 결과 요소를 생성합니다.
사용 예제
예를 들어, 두 개의 정수 리스트가 있고, 각각의 요소를 더하여 새로운 리스트를 생성하려는 경우 다음과 같이 Zip을 사용할 수 있습니다.
var list1 = new List { 1, 2, 3 }; var list2 = new List { 4, 5, 6 };
var sumList = list1.Zip(list2, (first, second) => first + second);
이 예제에서는 list1과 list2의 각 요소를 더하여 sumList를 생성합니다. 결과는 { 5, 7, 9 }가 됩니다.
참고
Zip 연산은 입력 시퀀스 중 더 짧은 길이를 가진 시퀀스의 끝에 도달할 때까지 수행됩니다. 따라서 두 시퀀스의 길이가 다를 경우, 더 긴 시퀀스의 나머지 요소들은 결과에 포함되지 않습니다.
Zip 메소드는 두 시퀀스를 동시에 순회하므로, 한 번의 반복으로 두 데이터 소스를 조합할 수 있는 경우에 유용합니다.
.NET 6 이상에서는 Zip을 확장하여 3개의 컬렉션을 짝지을 수 있는 오버로드가 추가되었습니다.
C# HEIC 파일 PNG 로 변환하기 (0) | 2024.04.14 |
---|---|
C# LINQ Zip 을 이용해 3개 List 번갈아 섞기 (0) | 2024.04.03 |
C# RadzenButton ToolTip / Busy indicator 표시하기 (0) | 2024.03.30 |
C# Balzor Page 에서 NavMenu 로 데이터 전달하기 (0) | 2024.03.23 |
C# Dynamic Linq 처리하기 (0) | 2024.03.22 |