[VB.NET] IComparable와 IComparer을 사용한 사용자 정의 정렬(sort)
클래스의 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