Como funciona a Interface IComparable, do .NET ?

Interface IComparable

A Interface IComparable normalmente é confundida com a interface IComparer. Ambos são utilizados para comparações entre objetos. O IComparable, ou comparável, possui um método com a assinatura: int CompareTo(System.Object); . Repare que este método retorna um int. Isto acontece por que outros métodos utilizam as variações de retorno de coleções que implementam IComparable para fazer ordenação. O algoritmo de ordenação utilizado pelo .NET e suas otimizações não serão descritas neste artigo.
A Interface IComparer, ou comparador, é utilizada de para comparar 2 objetos segundo a assinatura:  int Compare(System.Object x, System.Object y);. Diferentemente do CompareTo(System.Object) do IComparable, o Compare(System.Object x, System.Object y) do IComparer compara 2 objetos, e não um objeto com o próprio.
Estas interfaces devem ser utilizadas para tipos por referência que não devam possuir sobrecarga do operador de comparação. Como o .NET não faz isso nativamente, recomenda-se fazer sobrecarga do operador de comparação ‘==’ que faz chamada ao método Compare(System.Object x, System.Object y), numa espécie de facade.
As interfaces IComparable e IComparer trabalham com System.Object e não com tipos genéricos. São heranças do .NET 1.0/1.1. Atualmente existem versões genéricas de ambas as interfaces. O trabalho com System.Object pede boxing e unboxing, interno e externo respectivamente. Se o tipo passado para os métodos das interfaces não estiver coerente com a classe, uma exceção deve ser lançada. Recomenda-se o uso da exceção ArgumentException para este tipo do problema.
O método int CompareTo de IComparable é base para o método Sort() de ArrayList funcionar. Este método deve retornar -1, 0 ou 1 seguindo um determinado critério definido pelo programador. Através de seu algoritmo interno de ordenação o Sort() de ArrayList faz o ordenamento.
Vamos considerar uma classe que implemente ICompare chamada Pessoa. Esta classe possui string nome e int idade. Vamos considerar que apenas o nome seja ordenável. Numa situação destas é interessante o uso do método CompareTo() da string nome como retorno do CompareTo() da classe Pessoa. Esta solução é válida para qualquer tipo primitivo ou mesmo por referencia que implemente ICompare e que seja ordenável em alguma classe.
public intCompareTo(object obj)
{
pessoateste p = (pessoateste)obj;
      return this.nome.CompareTo(p.nome);
}

Thiago Anselme
Thiago Anselme - Gerente de TI - Arquiteto de Soluções

Ele atua/atuou como Dev Full Stack C# .NET / Angular / Kubernetes e afins. Ele possui certificações Microsoft MCTS (6x), MCPD em Web, ITIL v3 e CKAD (Kubernetes) . Thiago é apaixonado por tecnologia, entusiasta de TI desde a infância bem como amante de aprendizado contínuo.

Deixe um comentário