Интерфейс IComparer
.NET Framework позволяет выполнять сортировку по нескольким критериям. Например, чтобы упорядочить массив работников сначала по заработной плате, а затем по имени (в группах с одинаковой зарплатой) следует реализовать интерфейс IComparer, содержащий единственный метод СотрагеТо. При этом вы сможете воспользоваться одной из перегруженных версий Array.Sort (или ArrayList.Sort), которая имеет следующую сигнатуру:
Public Shared Sub Sort(ByVal array As Array. ByVal comparer As IComparer)
Обычно в программе создается отдельный класс, реализующий IComparer, и экземпляр этого класса передается методу Sort. Пример такого класса приведен ниже. Обратите внимание на выделенную строку – в ней имена работников передаются в виде строк методу Compare класса String:
Public Class SortByName Implements IComparer Public Function CompareTo(ByVal firstEmp As Object.ByVal secondEmp=As Object) As Integer Implements IComparer.Compare Dim temp1 As Employee = CType(firstEmp,Employee) Dim temp2 As Employee = CType(secondEmp.Employee) Return String.Compare(templ.TheName .temp2.TheName) End Function End Class
Пример процедуры Sub Main с использованием этого класса:
SubMain() Dim torn As New Employee("Tom", 50000) Dim sally As New Employee("Sally". 60000) Dim sam As New Employee("Sam". 60000) Dim ted As New Employee("Ted". 50000) Dim theEmployees() As Employee = _ {torn.sally,sam.ted} Array.Sort(theEmployees) Dim SortingByName As SortByName = New SortByName() Array.Sort(theEmployees,SortingByName) Dim aEmployee As Employee For Each aEmployee In theEmployees Console.WriteLine(aEmployee.TheName & "has yearly salary $" & FormatNumberCaEmployee.Salary)) Next Console. ReadLine() End Sub.
Результат показан на рис. 5.10.
Рис. 5.10. Сортировка по нескольким критериям с использованием IComparer
Примечание
В программе можно определить несколько классов, реализующих IComparer. Их последовательное применение позволяет выполнять многоуровневую сортировку произвольной глубины.