기술공부/언어

[C#] List정렬 - OrderBy

봉두두 2022. 3. 31. 11:00
728x90

System.Collections.Generic 라이브러리의 List 자료형.

List정렬에는 Sort() 함수를 사용하는것이 보편적이지만

특정 인자에 대해서 Sorting할 수 있는 OrderBy()와 OrderByDescending()와 같은 함수를 사용할 수도 있다.

 

그럼 바로 한번 테스트해보자.

해당 함수는 백준의 10814번, 나이순 정렬 문제를 풀 때 적용하였다.

 

[18014] 나이순 정렬(C#)

단순 Sorting방식으로만 정렬해봤다면 고개를 갸우뚱 할 수 있는 문제. 제한시간 : 15mins 시간복잡도 : O(NlogN) var varN = Console.ReadLine(); int intN = varN == null ? 0 : int.Parse(varN); // Map형식으..

jy0605.tistory.com

 

OrderBy()부터 알아보기

List형의 기본 내장함수인 Sort()의 경우, return값이 없는 void형 함수이며 기존 List를 정렬하는 함수이다.

OrderBy()의 경우 return값이 List형이기 때문에 새로이 정렬된 List를 반환값으로 받을 수 있다.

 

아래와 같이 사용할 수 있다.

// 예시로 Tuple 자료형을 멤버로 가지는 List 선언
List<Tuple<int, string>> tList = new List<Tuple<int, string>>();

// 전체 항목에 대해 ascending 정렬을 수행
List.Sort();

// tList내에 각각의 Tuple에 대하여 Item1 항목에 대해 ascending 정렬을 수행
tListOrderByAscending = List.OrderBy(t => t.Item1).ToList();

만약 tList의 멤버가 { (20, "Josh"), (20, "Ashley"), (22, "Jonathan"), (23, "Bob"), (23, "Kate") } 와 같다고 가정했을 때, Sort() 함수로 정렬했을 때와 OrderBy()함수로 정렬했을 때의 차이는 어떻게 발생할까?

// Sort() 결과값 =>
{ (20, "Ashley"), (20, "Josh"), (22, "Jonathan"), (23, "Bob"), (23, "Kate") }

// OrderBy() 결과값 =>
{ (20, "Josh"), (20, "Ashley"), (22, "Jonathan"), (23, "Bob"), (23, "Kate") }

Sort()의 경우 Item1과 Item2 모든 항목에 대해서 정렬을 수행했기 때문에, Item1의 숫자순으로 뿐 아니라 Item2의 알파벳순으로도 정렬이 이루어졌다.

OrderBy()의 경우 Tuple에서 Item1 에 대해서 정렬하도록 했기 때문에, 기존 List 순서에서 Item1에 대해서 정리하고 Item2에 대한 정렬은 고려하지 않았다.

 

☞ 오름차순 말고 내림차순은?

OrderBy()는 기본적으로 오름차순 정렬이다. 이에 짝꿍인 OrderByDescending() 메서드가 존재한다. 오 간편!

사용법은 똑같다. 정렬을 수행할 속성만 정해주면 해당 속성에 따라 내림차순한 List를 반환한다

ThenBy() 알아보기

그런데 무언가를 정렬할 때, 조건이 꼭 하나일 수는 없으니까.. 여러 조건을 달 수는 없을까?

이 때 ThenBy() 함수를 활용하면 된다!

 

상기 똑같은 List 멤버를 가지고 테스트를 해보자.

OrderBy().ThenBy()는 아래와 같이 사용할 수 있다.

// 상기와 똑같은 예시로 Tuple 자료형을 멤버로 가지는 List 선언
List<Tuple<int, string>> tList = new List<Tuple<int, string>>();

// 전체 항목에 대해 ascending 정렬을 수행
List.Sort();

// tList내에 각각의 Tuple에 대하여 
// Item1 항목 정렬 후 Item2 항목에 대해서도 ascending 정렬을 수행
tListOrderByAscending = List.OrderBy(t => t.Item1).ThenBy(t => t.Item2).ToList();

Sort()의 결과와 OrderBy().ThenBy() 결과를 한번 비교해보면 좋겠다.

// Sort() 결과값 =>
{ (20, "Ashley"), (20, "Josh"), (22, "Jonathan"), (23, "Bob"), (23, "Kate") }

// OrderBy() 결과값 =>
{ (20, "Ashley"), (20, "Josh"), (22, "Jonathan"), (23, "Bob"), (23, "Kate") }

OrderBy().ThenBy()로 모든 Item에 대해 Ascending 정렬을 수행했기 때문에 이 때에는 Sort()와 동일한 결과를 가진다.

ThenBy 또한 Descending정렬로서 수행할 수 있다. OrderBy(t=>t.Item1).ThenByDescending(t=>t.Item2)의 경우엔 Item2에 대해서 내림차순 정렬을 수행하므로 Josh -> Ashley -> Jonathan -> Kate -> Bob 순으로 정렬된 List를 얻는다.

728x90
728x90