LINQ 순서정렬 연산자 (OrderBy)

2022. 2. 4. 00:00CSharp/Advance

반응형

ProductList 와 CusomerList 는 아래 sample 참고
https://github.com/dotnet/try-samples/tree/main/101-linq-samples/src/DataSources

 

GitHub - dotnet/try-samples

Contribute to dotnet/try-samples development by creating an account on GitHub.

github.com

OrderBy, ThenBy, OrderbyDescending, ThenByDescending

데이터 출력을 정렬하는 데 사용

 

요소정렬

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

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

Console.WriteLine("The sorted list of words:");
foreach (var w in sortedWords)
{
    Console.WriteLine(w);
}

//output
The sorted list of words:
apple
blueberry
cherry

단일 속성을 사용하여 정렬

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

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

Console.WriteLine("The sorted list of words (by length):");
foreach (var w in sortedWords)
{
    Console.WriteLine(w);
}

//output
The sorted list of words (by length):
apple
cherry
blueberry

비교자를 사용하여 정렬

// 비교자 정의
public class CaseInsensitiveComparer : IComparer<string>
{
    public int Compare(string x, string y) =>
        string.Compare(x, y, StringComparison.OrdinalIgnoreCase);
}

// 비교자 사용 정렬
string[] words = { "aPPLE", "AbAcUs", "bRaNcH", "BlUeBeRrY", "ClOvEr", "cHeRry" };
var sortedWords = words.OrderBy(a => a, new CaseInsensitiveComparer());
foreach (var word in sortedWords)
{
    Console.WriteLine(word);
}

//output
AbAcUs
aPPLE
BlUeBeRrY
bRaNcH
cHeRry
ClOvEr

기본 정렬키가 같을때 추가 정렬키 지정 (ThenBy)

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

// orderby 에서 뒤쪽 digit 가 ThenBy 에 해당한다.
var sortedDigits = from digit in digits
                   orderby digit.Length, digit
                   select digit;

Console.WriteLine("Sorted digits:");
foreach (var d in sortedDigits)
{
    Console.WriteLine(d);
}
// output
Sorted digits:
one
six
two
five
four
nine
zero
eight
seven
three

내림차순으로 정렬

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

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

Console.WriteLine("The doubles from highest to lowest:");
foreach (var d in sortedDoubles)
{
    Console.WriteLine(d);
}

//output
The doubles from highest to lowest:
4.1
2.9
2.3
1.9
1.7

기본키는 오름차순으로 그게 같다면 다른 키는 내림차순으로 정렬 시키기

List<Product> products = GetProductList();

// Cartegory 별로 오름 차순, UnitPrice 별로 내림 차순으로 정렬
var sortedProducts = from prod in products
                     orderby prod.Category, prod.UnitPrice descending
                     select prod;

foreach (var product in sortedProducts)
{
    Console.WriteLine(product);
}

//output
ProductID=38 ProductName=Cote de Blaye Category=Beverages UnitPrice=$263.50 UnitsInStock=17
ProductID=43 ProductName=Ipoh Coffee Category=Beverages UnitPrice=$46.00 UnitsInStock=17
ProductID=2 ProductName=Chang Category=Beverages UnitPrice=$19.00 UnitsInStock=17
ProductID=1 ProductName=Chai Category=Beverages UnitPrice=$18.00 UnitsInStock=39
ProductID=35 ProductName=Steeleye Stout Category=Beverages UnitPrice=$18.00 UnitsInStock=20
ProductID=39 ProductName=Chartreuse verte Category=Beverages UnitPrice=$18.00 UnitsInStock=69
ProductID=76 ProductName=Lakkalikoori Category=Beverages UnitPrice=$18.00 UnitsInStock=57
ProductID=70 ProductName=Outback Lager Category=Beverages UnitPrice=$15.00 UnitsInStock=15
ProductID=34 ProductName=Sasquatch Ale Category=Beverages UnitPrice=$14.00 UnitsInStock=111
ProductID=67 ProductName=Laughing Lumberjack Lager Category=Beverages UnitPrice=$14.00 UnitsInStock=52
ProductID=75 ProductName=Rhonbrau Klosterbier Category=Beverages UnitPrice=$7.75 UnitsInStock=125
ProductID=24 ProductName=Guarana Fantastica Category=Beverages UnitPrice=$4.50 UnitsInStock=20\
...
...
ProductID=63 ProductName=Vegie-spread Category=Condiments UnitPrice=$43.90 UnitsInStock=24
ProductID=8 ProductName=Northwoods Cranberry Sauce Category=Condiments UnitPrice=$40.00 UnitsInStock=6
ProductID=61 ProductName=Sirop d'erable Category=Condiments UnitPrice=$28.50 UnitsInStock=113
ProductID=6 ProductName=Grandma's Boysenberry Spread Category=Condiments UnitPrice=$25.00 UnitsInStock=120
ProductID=4 ProductName=Chef Anton's Cajun Seasoning Category=Condiments UnitPrice=$22.00 UnitsInStock=53
ProductID=5 ProductName=Chef Anton's Gumbo Mix Category=Condiments UnitPrice=$21.35 UnitsInStock=0
ProductID=65 ProductName=Louisiana Fiery Hot Pepper Sauce Category=Condiments UnitPrice=$21.05 UnitsInStock=76
ProductID=44 ProductName=Gula Malacca Category=Condiments UnitPrice=$19.45 UnitsInStock=27
ProductID=66 ProductName=Louisiana Hot Spiced Okra Category=Condiments UnitPrice=$17.00 UnitsInStock=4

입력 순서의 반대로 정렬 시키기

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

Console.WriteLine("A backwards list of the digits with a second character of 'i':");
foreach (var d in reversedIDigits)
{
    Console.WriteLine(d);
}

//output
A backwards list of the digits with a second character of 'i':
nine
eight
six
five

 

관련영상

https://youtu.be/oSt1ricG2TU

 

반응형

'CSharp > Advance' 카테고리의 다른 글

Linq 집합 연산자 (Set Operators)  (0) 2022.02.08
LINQ Grouping Operators (GroupBy , into)  (0) 2022.02.07
LINQ Partition 연산자 (Take, Skip)  (0) 2022.02.03
LINQ Projection 연산자 (Select)  (0) 2022.02.02
LINQ 제한 연산자 (Where)  (0) 2022.02.01