Il comando sort(lista) ordina gli oggetti di una lista in ordine crescente (se si tratta di una lista di numeri) o in ordine alfabetico (se si tratta di una lista di stringhe).
La funzione di un comparatore è quella di indicare il criterio dell’ordinamento, quindi in base a cosa si vuole ordinare una lista.
Il comparatore deve essere definito in una classe ed in seguito inserito come input all’interno del comando sort.
Esistono due particolari interfacce in Visual Basic.NET, che ci aiutano nel processo di ordinamento: IComparer e Icomparable.
Queste due interfacce hanno obiettivi leggermente diversi nonostante vengano spesso utilizzate insieme.
Icomparable interface
L’interfaccia Icomparable fornisce un metodo per confrontare due oggetti di un determinato tipo, si utilizza questa interfaccia se si ha intenzione di ordinare gli oggetti.
Se si dispone di una matrice di oggetti di un certo tipo e si utilizza il metodo di ordinamento su tale matrice, è possibile utilizzare l’interfaccia IComparable per confrontare gli oggetti durante l’ordinamento.
Quando si implementa l’interfaccia IComparable , è necessario implementare anche il metodo CompareTo.
Un esempio di codice con Visual Basic è il seguente:
Function CompareTo(ByVal obj As Object) As Integer Implements IComparable.CompareTo Dim c As car = CType(obj, car) Return String.Compare(Me.mmake, c.mmake) End Function
Icomparer interface
L’interfaccia Icomparer fornisce ulteriori meccanismi di confronto.
Icomparer(Of type) serve a rappresentare una particolare strategia per confrontare due istanze del tipo type, il suo utilizzo nel metodo sort di una lista consente di cambiare criteri di ordinamento in maniera veramente versatile, semplicemente fornendo come argomento, di volta in volta, dei comparer differenti, secondo la necessità.
È possibile con questa interfaccia ad esempio, ordinare la classe su diversi campi o proprietà, nell’ordine crescente o decrescente in base allo stesso campo o entrambi.
Di seguito un altro codice con VB relativo a questa interfaccia:
Public Class Vehicle
Public Property Speed As Integer
End Class
Public Class Car
Inherits Vehicle
End Class
Public Class SpeedComparer
Implements IComparer(Of Vehicle)
Public Function Compare(ByVal x As Vehicle, ByVal y As Vehicle, ByVal y As Vehicle)
As Integer Implements Icomparer(Of Vehicle).Compare
Return x.Speed - y.Speed
End Function
End Class