반응형
C# Zip이란
- Zip은 두 시퀀스를 하나로 결합(pairing)해서 새로운 시퀀스를 만드는 매서드이다.
var result = first.Zip(second, (a, b) => ...);
매개변수
IEnumerable<TResult> Zip<TFirst, TSecond, TResult>(
IEnumerable<TFirst> first,
IEnumerable<TSecond> second,
Func<TFirst, TSecond, TResult> resultSelector
)
first IEnumerable<TFirst>
병합할 첫 번째 시퀀스
second IEnumerable<TSecond>
병합할 두 번째 시퀀스
resultSelector Func<TFirst, TSecond, TResult>
두 시퀀스의 요소를 병합하는 방법을 지정하는 함수
반환값
IEnumerable<TResult>
두 입력 시퀀스의 병합된 요소가 들어있는 IEnumerable<T>
예제 코드
int[] numbers = { 1, 2, 3, 4 };
string[] words = { "one", "two", "three" };
var numbersAndWords = numbers.Zip(words, (first, second) => first + " " + second);
foreach (var item in numbersAndWords)
Console.WriteLine(item);
// This code produces the following output:
// 1 one
// 2 two
// 3 three
첫번째 시퀀스의 각 요소를 두 번째 시퀀스에서 동일한 인덱스가 있는 요소와 병합한다. 시퀀스에 동일할 수의 요소가 없는 경우 메서드는 시퀀스가 해당 요소 중 하나의 끝에 도달할 때까지 시퀀스를 병합한다. 예를 들어 한 시퀀스에 3개의 요소가 있고 다른 시퀀스에 4개의 요소가 있는 경우 결과 시퀀스에는 3개의 요소만 들어간다.
즉, Enumerable.Zip은 가로 데이터들의 나열을 세로 데이터의 쌍으로 바꿔준다.
특성 및 주의사항
- 짧은 쪽 기준으로 짧은 시퀀스 길이에 맞춰 결과가 잘린다.
- 순서가 유지된다.
- 지연 평가(Lazy Evaluation)로 foreach를 돌리기 전까지 실제로 연산이 일어나지 않는다.
추가 예제 코드
using System;
using System.Collections.Generic;
using System.Linq;
public partial class Program
{
static void Main(string[] args)
{
var list = new List<int>() { 1, 2, 3, 4, 5 };
var string_list = new List<string>() { "a", "b", "c", "d", "e" };
var string_list2 = new List<string>() { "f", "g", "h", "i", "j" };
var float_list = new List<float>() { 1.2F, 3.54F, 5.36F, 8.3F, 4.31F };
var result = list.Zip(string_list).Zip(string_list2).Zip(float_list);
Console.WriteLine("-------------------------------------------");
foreach (var item in result)
{
Console.WriteLine($"item : {item}");
Console.WriteLine($"first item : {item.First}");
Console.WriteLine($"second item : {item.Second}");
Console.WriteLine($"first first item : {item.First.First}");
Console.WriteLine($"first second item : {item.First.Second}");
Console.WriteLine($"first first first item : {item.First.First.First}");
Console.WriteLine($"first first second item : {item.First.First.Second}");
Console.WriteLine("-------------------------------------------");
}
}
}
'프로그래밍 > C# LINQ' 카테고리의 다른 글
C# LINQ - Enumerable.TakeWhile (0) | 2024.03.28 |
---|---|
C# 표준 질의 연산자(Standard Query Operators) (1) | 2024.02.26 |
C# Linq - Enumerable.Take() (0) | 2024.02.26 |
C# Linq - Enumerable.Reverse() (0) | 2024.02.19 |
C# Linq - Enumerable.OfType() (1) | 2024.02.16 |
댓글