카테고리 없음

[VB.NET] IComparable와 IComparer을 사용한 사용자 정의 정렬(sort)

woody.choi 2009. 11. 4. 15:15

클래스의 list에 기본 Sort 메서드와 사용자 정의 Sort Field를 이용한 방법이다.
즉, class.sort()와 class.sort(mySortColumnComparer)를 구현하는 것이 목적이다.

Order클래스는  IComparable(Of Order)으로 부터 상속 받는다.
AscendingCirculationComparer는 사용자가 정의하는  Sort Field이다. IComparer(Of Order)으로 부터 상속 받는다.

-- order.vb --
Imports System
Imports System.Collections.Generic

Public Class Order
    Implements IComparable(Of Order)

    Private _orderNumber As String
    Private _itemCount As Integer

    Public Sub New(ByVal orderNumber As String, ByVal itemCount As Integer)
        _orderNumber = orderNumber
        _itemCount = itemCount
    End Sub

    Public ReadOnly Property OrderNumber() As String
        Get
            Return _orderNumber
        End Get
    End Property

    Public ReadOnly Property ItemCount() As Integer
        Get
            Return _itemCount
        End Get
    End Property

    Public Shared ReadOnly Property ItemCountSorter() As IComparer(Of Order)
        Get
            Return New AscendingItemCountComparer
        End Get
    End Property

    Public Overrides Function ToString() As String
        Return String.Format("{0}: Item count = {1}", OrderNumber, ItemCount)
    End Function

    Public Function CompareTo(ByVal other As Order) As Integer Implements System.IComparable(Of Order).CompareTo
        If other Is Nothing Then Return 1
        If other Is Me Then Return 0

        Return String.Compare(Me.OrderNumber, other.OrderNumber, True)
    End Function
End Class



----- AscendingCirculationComparer.vb --------

Imports System
Imports System.Collections.Generic

Public Class AscendingItemCountComparer
    Implements IComparer(Of Order)

    Public Function Compare(ByVal x As Order, ByVal y As Order) As Integer Implements System.Collections.Generic.IComparer(Of Order).Compare
        If x Is Nothing And y Is Nothing Then
            Return 0
        ElseIf x Is Nothing Then
            Return -1
        ElseIf y Is Nothing Then
            Return 1
        End If

        If x Is y Then
            Return 0
        End If

        Return x.ItemCount - y.ItemCount
    End Function
End Class

---- Module1.vb ----------

Module Module1

    Sub Main()
        Dim Orders As New List(Of Order)
        Orders.Add(New Order("0004", 10))
        Orders.Add(New Order("0003", 5))
        Orders.Add(New Order("0002", 3))
        Orders.Add(New Order("0001", 8))

        Console.Clear()
        Console.WriteLine("Unsorted orders list: ")

        For Each n As Order In Orders
            Console.WriteLine(" {0}", n.ToString)
        Next

        Console.WriteLine(Environment.NewLine)
        Orders.Sort()

        For Each n As Order In Orders
            Console.WriteLine(" {0}", n.ToString)
        Next

        Console.WriteLine(Environment.NewLine)

        Orders.Sort(Order.ItemCountSorter)

        For Each n As Order In Orders
            Console.WriteLine(" {0}", n.ToString)
        Next
        Console.ReadLine()
    End Sub
End Module