VB.NET: paragoni tra generici

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

Riferimenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

*