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
ไม่มีความคิดเห็น:
แสดงความคิดเห็น