KeiStory

728x90
반응형

C# 두 List 를 번갈아 섞기 - LINQ ZIP

 

두 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));

결과는 첫번째 결과와 동일합니다.

LINQ ZIP

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개의 컬렉션을 짝지을 수 있는 오버로드가 추가되었습니다.

728x90

공유하기

facebook twitter kakaoTalk kakaostory naver band