본문 바로가기

Develop/.NET 가이드

[C#] LINQ 사용방법 - 정렬 연산자 OrderBy, ThenBy, OrderByDescending, ThenByDescending

반응형

LINQ
LINQ

정렬 연산자 Ordering Operator

정렬 연산자인 OrderBy는 당연히 출력 시퀀스를 기준에 따라 정렬하는 연산자입니다. 자주 사용하는 연산자이므로 여러 예제를 통해 익히고 자주 사용하여 경험을 쌓길 바랍니다.

원소 정렬하기

알파벳 순서로 정렬합니다.

            string[] words = { "cherry", "apple", "blueberry" };

            var sortedWords = from word in words
                              orderby word
                              select word;

               // sortedWords = { "apple", "blueberry", "cherry" };

원소의 속성으로 정렬하기

String.Length 속성을 사용하여 정렬합니다.

            string[] words = { "cherry", "apple", "blueberry" };

            var sortedWords = from word in words
                              orderby word.Length
                              select word;

               // sortedWords = { "apple", "cherry", "blueberry" }

클래스의 속성으로 정렬하기

Product.ProductName 속성으로 정렬합니다.

            List<Product> products = GetProductList();

            var sortedProducts = from prod in products
                                 orderby prod.ProductName
                                 select prod;

내림차순으로 정렬하기

descending 키워드로 내림차순 정렬합니다.

            double[] doubles = { 1.7, 2.3, 1.9, 4.1, 2.9 };

            var sortedDoubles = from d in doubles
                                orderby d descending
                                select d;

            // sortedDoubles = { 4.1, 2.9, 2.3, 1.9, 1.7 }
            List<Product> products = GetProductList();

            var sortedProducts = from prod in products
                                 orderby prod.UnitsInStock descending
                                 select prod;

여러 기준으로 정렬하기

먼저 digit.Length로 정렬한 뒤, digit 으로 알파벳 오름차순으로 정렬합니다.

            string[] digits = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };

            var sortedDigits = from digit in digits
                               orderby digit.Length, digit
                               select digit;

            // sortedDigits = { 
            //        "one", "six", "two", 
            //         "five", "four", "nine", "zero", 
            //        "eight", "seven", "three" 
            //    }

먼저 Product.Category 속성으로 오름차순 정렬한 뒤, Product.UnitPrice 속성으로 내림차순 정렬합니다.

            List<Product> products = GetProductList();

            var sortedProducts = from prod in products
                                 orderby prod.Category, prod.UnitPrice descending
                                 select prod;

정렬 뒤집기

digits 배열 원소 중 두번째 문자가 'i'인 원소만 출력 시퀀스에 추가한 뒤, 출력 시퀀스 순서를 뒤집습니다.

            string[] digits = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };

            var reversedIDigits = (
                from digit in digits
                where digit[1] == 'i'
                select digit)
                .Reverse();

            // reversedIDigits = { "nine", "eight", "six", "five" };

비교 연산자를 구현해 활용하기

먼저 비교 연산자를 구현합니다.

        public class CaseInsensitiveComparer : IComparer<string>
        {
            public int Compare(string x, string y) => 
                string.Compare(x, y, StringComparison.OrdinalIgnoreCase);
        }

이제 구현된 비교 연산자를 LINQ OrderBy 메서드에 활용합니다.

            string[] words = { "aPPLE", "AbAcUs", "bRaNcH", "BlUeBeRrY", "ClOvEr", "cHeRry" };

            var sortedWords = words.OrderBy(a => a, new CaseInsensitiveComparer());

            // sortedWords = { "AbAcUs", "aPPLE", "BlUeBeRrY", "bRaNcH", "cHeRry", "ClOvEr" }
            string[] words = { "aPPLE", "AbAcUs", "bRaNcH", "BlUeBeRrY", "ClOvEr", "cHeRry" };

            var sortedWords = words.OrderByDescending(a => a, new CaseInsensitiveComparer());

            // sortedWords = { "ClOvEr", "cHeRry", "bRaNcH", "BlUeBeRrY", "aPPLE", "AbAcUs" }

비교 연산자를 중첩해서 사용하기

OrderBy 메서드로 정렬 후에 ThenBy 연산자로 추가 정렬합니다.

            string[] words = { "aPPLE", "AbAcUs", "bRaNcH", "BlUeBeRrY", "ClOvEr", "cHeRry" };

            var sortedWords = words
                .OrderBy(a => a.Length)
                .ThenBy(a => a, new CaseInsensitiveComparer());

            // sortedWords = { 
            //     "aPPLE",
            //    "AbAcUs", "bRaNcH", "cHeRry", "ClOvEr",
            //     "BlUeBeRrY"
            // }
            string[] words = { "aPPLE", "AbAcUs", "bRaNcH", "BlUeBeRrY", "ClOvEr", "cHeRry" };

            var sortedWords = words
                .OrderBy(a => a.Length)
                .ThenByDescending(a => a, new CaseInsensitiveComparer());

            // sortedWords = { 
            //     "BlUeBeRrY"
            //    "AbAcUs", "bRaNcH", "cHeRry", "ClOvEr",
            //     "aPPLE",
            // }
반응형