C#의 LINQ를 활용하면 시퀀스(배열 등)에서 원하는 위치의 요소를 손쉽게 추출할 수 있습니다. 이번 예제에서는 OrderByDescending()과 Take() 메서드를 조합하여 배열을 내림차순으로 정렬한 뒤, 시작 부분에서 지정된 개수만큼의 요소를 반환하는 방법을 알아보겠습니다.
1. 배열 선언 및 내림차순 정렬
먼저 정수형 배열을 하나 선언합니다. 이후 OrderByDescending()을 사용하면 요소들을 큰 값부터 작은 값 순서로 정렬할 수 있습니다.
int[] prod = { 290, 340, 129, 540, 456, 898, 765, 789, 345};2. Take() 메서드로 앞부분 요소 가져오기
Take() 메서드는 시퀀스의 시작 부분에서 인수로 전달된 개수만큼의 요소를 반환합니다. 아래 코드에서는 내림차순으로 정렬된 결과 중 상위 2개의 요소를 가져옵니다.
IEnumerable<int> units = prod.AsQueryable().OrderByDescending(s => s).Take(2);
즉, 정렬 후 가장 큰 두 개의 값이 선택됩니다. Take()에 다른 숫자를 전달하면 그 개수만큼 요소를 가져올 수 있어 상위 N개 데이터 조회에 유용하게 활용됩니다.
전체 예제 코드
지금까지의 내용을 종합한 완전한 코드는 다음과 같습니다.
using System;
using System.Linq;
using System.Collections.Generic;
public class Demo {
public static void Main() {
int[] prod = { 290, 340, 129, 540, 456, 898, 765, 789, 345};
// 판매량 기준 상위 2개 제품 조회
IEnumerable<int> units = prod.AsQueryable().OrderByDescending(s => s).Take(2);
foreach (int res in units) {
Console.WriteLine(res);
}
}
}실행 결과
위 프로그램을 실행하면 내림차순으로 정렬된 값 중 앞의 두 요소가 출력됩니다.
898 789
정리
이처럼 LINQ의 OrderByDescending()은 시퀀스를 내림차순으로 정렬하고, Take()는 정렬된 시퀀스에서 처음 N개의 요소를 추출합니다. 두 메서드를 함께 사용하면 '최고 판매량 상위 2개 제품'처럼 상위 항목만 간단히 조회할 수 있습니다. 참고로 Take()는 지연 실행(lazy evaluation) 방식으로 동작하므로 foreach 루프에서 실제로 열거될 때 쿼리가 실행됩니다.