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)
.