Per la nostra gioia, il framework .NET mette diversi strumenti a disposizione per poter confrontare ed eventualmente ordinare oggetti definiti come Generics.
L’interfaccia IComparable(Of T)
L’interfaccia IComparable(Of T) (che ricorda molto la versione non generica: IComparable) espone un metodo CompareTo(Of T) che permette di confrontare l’istanza con un oggetto, dello stesso tipo, passato come parametro. Al contrario di quanto accade per la versione non generica dell’interfaccia, nell’implementare il metodo non dovremo preoccuparci di controllare che il parametro passato sia dello stesso tipo (Studente, in questo caso) ma dovremo solo assicurarci che l’oggetto passato come parametro non sia Nothing.
Public Class Studente
Implements IComparable(Of Studente)
Public CodStudente As Integer
Public Overloads Function CompareTo(ByVal Other As Studente) As Integer
Implements IComparable(Of Studente).CompareTo
If Other Is Nothing Then
Return 1
End If
Return CodStudente.CompareTo(Other.CodStudente)
End Function
End Class
L’interfaccia IComparer(Of T)
L’interfaccia IComparer(Of T) (anch’essa ricorda molto la versione non generica: Comparer) espone un metodo Compare(Of T)che permette di confrontare due oggetti, che devono essere passati come parametri. Coerentemente con quanto visto sopra, occorre gestire il caso in cui uno o entrambi gli oggetti siano impostati a Nothing.
Public Class EmployeeComparer
Implements IComparer(Of Employee)
Public Function Compare(ByVal x As Employee, ByVal y As Employee) As Integer
Implements IComparer(Of Employee).Compare
If x Is Nothing Then
If y Is Nothing Then
Return 0
Else
Return 1
End If
End If
Return -x.CompareTo(y)
End Function
End Class
Il metodo IComparer(Of T).Compare viene usato da uno degli overload dei metodi Sort(Of T) e BinarySearch(Of T) della classe List, per eventualmente personalizzarne il comportamento.
La classe Comparer(Of T)
La classe Comparer(Of T) implementa le interfacce IComparer(Of T) e
IComparer (cioè sia la versione generica, sia quella non generica), quindi espone il metodo Compare come visto sopra.
Inoltre questa classe aggiunge l’importante proprietà Default, di tipo Comparer(Of T), che restituisce il metodo di ordinamento di default per la classe T; in altre parole, il metodo List(Of T).Sort userà questo metodo per ordinare gli elementi.
L’oggetto Comparer(Of T) restituito dalla proprietà a sua volta usa l’interfaccia IComparable(Of T) per confrontare due oggetti; ma se il tipo T non implementa l’interfaccia IComparable(Of T) allora la proprietà Default restituirà un oggetto Comparer(Of T) che implementa l’interfaccia IComparer (versione non generica)
Confronto tra stringhe
Per il confronto tra stringhe è consigliato l’uso della classe StringComparer rispetto all’uso della classe Comparer(Of String).