C# LINQ에는 시퀀스(컬렉션)의 요소를 손쉽게 제어할 수 있는 Take와 Skip 연산자가 있습니다. 두 연산자는 각각 다음과 같은 역할을 수행합니다.
- Take: 시퀀스의 첫 번째 요소부터 지정한 개수만큼 요소를 반환합니다.
- Skip: 시퀀스의 첫 번째 요소부터 지정한 개수만큼 요소를 건너뛴 나머지를 반환합니다.
즉, Take는 배열이나 리스트에서 원하는 개수의 요소를 가져오고, Skip은 지정된 위치까지의 요소를 무시하는 방식으로 동작합니다. 이 두 연산자를 함께 사용하면 특정 범위의 데이터만 추출할 수 있어 페이징 처리 등에 매우 유용합니다.
예제 1: Skip 연산자 사용하기
아래 예제에서는 28개의 숫자로 이루어진 리스트에서 앞의 5개 요소를 건너뛰고 결과를 확인합니다.
class Program{
static void Main(string[] args){
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 5, 6, 7, 7, 8, 8 };
System.Console.WriteLine(numbers.Count());
var skipRes = numbers.Skip(5);
System.Console.WriteLine(skipRes.Count());
Console.ReadLine();
}
}실행 결과
28 23
전체 28개 요소 중 앞의 5개가 제외되어 23개의 요소가 남게 됩니다.
예제 2: Take 연산자 사용하기
이번에는 같은 리스트에서 앞의 5개 요소만 가져오는 예제입니다.
class Program{
static void Main(string[] args){
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 5, 6, 7, 7, 8, 8 };
System.Console.WriteLine(numbers.Count());
var takeRes = numbers.Take(5);
System.Console.WriteLine(takeRes.Count());
Console.ReadLine();
}
}실행 결과
28 5
전체 28개 중 첫 번째 요소부터 5개의 요소만 선택되었습니다.
예제 3: Skip과 Take 함께 사용하기
두 연산자를 메서드 체이닝으로 연결하면, 앞부분을 건너뛴 뒤 원하는 개수만큼 요소를 가져올 수 있습니다. 아래 예제는 앞의 10개 요소를 건너뛴 후 그다음 18개의 요소를 가져옵니다.
class Program{
static void Main(string[] args){
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 5, 6, 7, 7, 8, 8 };
System.Console.WriteLine(numbers.Count());
var takeSkipRes = numbers.Skip(10).Take(18);
System.Console.WriteLine(takeSkipRes.Count());
Console.ReadLine();
}
}실행 결과
28 18
28개 요소 중 처음 10개를 Skip하고 이후 18개를 Take하여 최종적으로 18개의 요소가 반환되었습니다.
정리
Skip(n)은 앞에서 n개의 요소를 제외하고, Take(n)은 앞에서 n개의 요소만 선택합니다. 두 연산자를 조합한 Skip(a).Take(b) 패턴은 대용량 데이터에서 특정 구간만 조회하는 페이지네이션(pagination) 구현에 널리 활용되므로 꼭 익혀두시기 바랍니다.