วันอาทิตย์ที่ ๑๒ กรกฎาคม พ.ศ. ๒๕๕๒

IComparer กับ IComparable ใช้งานอย่างไร

วันก่อนมีกระทู้ฮอตที่ greatfriends ครับ
BLOG - Generic Function - MAX(Of T As IComparable(Of T))

สรุปคือมีการสับสนระหว่าง IComparer กับ IComparable ครับ ซึ่งไม่ใช่เรื่องแปลกเพราะว่าในเวบต่างประเทศเอง ก็มีคำถามเรื่องนี้บ่อยๆ

อาจารย์สุเทพสรุปดังนี้
IComparer ใช้สำหรับ
1. ไม่ต้องการ implement เข้าไปในคลาส เช่น มีรูปแบบการเปรียบเทียบไม่แน่นอน
2. ไม่สามารถ implement เข้าไปในคลาสได้ เช่น ไม่มี source code

ผมขอเพิ่มตามความเข้าใจนะครับ IComparable เป็น Interface สำหรับ Class ที่เราต้องการให้สามารถเปรียบเทียบได้ โดยมีลักษณะที่แน่นอน นั่นคือ Object ที่สร้างจาก class นี้ จะไปเปรียบเทียบกับ object อื่นที่สร้างจาก Class เดียวกัน

Public Class Employee
Implements IComparable(Of Employee)
...
End Class


ส่วน IComparer ชื่อก็ค่อนข้างสื่ออยู่แล้ว คือใช้สำหรับสร้าง Comparer Class หมายความว่าเราต้องการ Class สำหรับ Compare Object สรุปคือเป็น third party ที่ใช้เปรียบเทียบ object ที่1 และ object ที่2 ครับ

Public Class EmployeeComparer
Implements IComparer(Of Employee)

Public Enum compareField
age
hiredDate
joinedDate
End Enum

Private _compareField As compareField = compareField.age
Private _sortDirection As System.ComponentModel.ListSortDirection = System.ComponentModel.ListSortDirection.Ascending

Public Function Compare(ByVal x As [Class].Center.Employee, ByVal y As [Class].Center.Employee) As Integer Implements System.Collections.Generic.IComparer(Of [Class].Center.Employee).Compare

If _sortDirection = ComponentModel.ListSortDirection.Ascending Then
.....
Else
.....
End If

End Function

End Class



จากกระทู้มีการคุยกันถึงการใช้ Linq และการใช้ Lamda Expression ในการ Sort หรือเปรียบเทียบ Object ซึ่งจะสะดวกขึ้นมาก ลองเข้าไปอ่านกันดูครับ

Dim employees As New List(Of BAS.Class.Center.Employee)
employees.Add(New BAS.Class.Center.Employee With {.EmployeeID = "100", .NameEng = "tabd"})
employees.Add(New BAS.Class.Center.Employee With {.EmployeeID = "200", .NameEng = "dss"})
employees.Add(New BAS.Class.Center.Employee With {.EmployeeID = "300", .NameEng = "xxx"})
employees.Add(New BAS.Class.Center.Employee With {.EmployeeID = "400", .NameEng = "yyy"})

employees.Sort(Function(x, y) String.Compare(x.NameEng, y.NameEng)) '// Sort ascending
employees.Sort(Function(x, y) String.Compare(y.NameEng, x.NameEng)) '// Sort descending

ไม่มีความคิดเห็น: