VB.NET OrderBy, ThenBy를 이용한 리스트 정렬 (역순정렬 포함)

2022. 12. 5. 14:59VB.NET

정렬이라는게 어렵지는 않지만 많이 번거롭다. 무엇보다 정렬속도를 신경써야되니 알려진 알고리즘을 사용해서 이진정렬등의 방법으로 정렬을 직접 해줬다.

그런데 List를 사용하면 이 정렬을 간단 단순하게 구현할 수 있다. 무지 편리한 기능이니 잘 적어두자.

일단 리스트를 단순화하는게 좋다. 2차원배열 이상의 차원은 구조체로 리스트를 만들어서 사용하자. 아주 간편하다.

예를 들어서 arr(A, B, C)의 3차원 배열이라 치자. 이걸 정렬하려고 3중 루프를 돌리면서 애쓰지 말자. 그냥 3개의 원소가 들어있는 구조체를 이용해서 하나의 리스트로 만들어주자.

 

    Private Structure ABC_TYPE
        Dim A As Integer
        Dim B As Integer
        Dim C As Integer
    End Structure

    Private Function AddList(pA As Integer, pB As Integer, pC As Integer) As ABC_TYPE
        Dim lpItem As ABC_TYPE
        lpItem.A = pA : lpItem.B = pB : lpItem.C = pC
        Return lpItem
    End Function

    Private Function MakeList() As List(Of ABC_TYPE)
        Dim lpList As New List(Of ABC_TYPE)
        lpList.Add(AddList(1, 2, 3))
        lpList.Add(AddList(4, 5, 6))
        lpList.Add(AddList(7, 8, 9))
        Return lpList
    End Function

우선 구조체를 선언하고, MakeList를 이용해서 리스트를 만든 후 SortList를 이용해서 정렬하면 된다. 이번글의 핵심은 아래 SortList안에 다 들어있다.

 

    Private Function SortList(pList As List(Of ABC_TYPE), pDesc As Boolean) As List(Of ABC_TYPE)
        Dim lpSortList = pList.OrderBy(Function(x) x.A).ThenBy(Function(x) x.B).ThenBy(Function(x) x.C).ToList()
        If pDesc Then lpSortList.Reverse()
        Return lpSortList
    End Function

OrderBy로 1차정렬, ThenBy로 2차정렬, 그다음 ThenBy로 3차, 4차, 5차, ..., n차 정렬이 가능하다. 정말 신경 많이써서 만든 기능인게 느껴지는 부분이다. 몇백만개를 정렬해봐도 크게 속도가 쳐지는 느낌은 안든다. 웬만한 고수가 아닌 이상 직접 만드는 정렬알고리즘보다 더 빠르게 동작한다.

그다음도 중요하다, 오름차순 정렬은 그냥 사용하고, 내림차순이 필요할때는 Reverse 함수로 뒤집어버리면 된다. 앞으로 정렬은 따로 만들지 말고 최대한 리스트로 만들어서 OrderBy를 사용하는 습관을 들이는게 좋겠다.

반응형