C# - Tornando um tipo Searchable


 Hoje veremos como fazer para tornar um tipo Searchable na linguagem C#.

Suponha que você tenha um tipo de dados que será armazenada como elementos em uma lista List<T> e você gostaria de usar o método BinarySearch para permitir uma pesquisa customizada de seus tipos de  dados na lista.

Podemos usar as interfaces IComparable<T> ou IComparer<T> definindo um implementação específica.

Assim basta o Tipo implementar a interface IComparable<T> ou IComparer<T> de tal forma que as coleções List<T> e SortedList <K, V> poderão ordenar e pesquisar uma matriz ou coleção de objetos do Tipo desejado.

Os algoritmos de pesquisa são integrados a essas duas classes; tudo que você precisa fazer é contar a elas como pesquisar suas classes por meio do código quando você implementar IComparable<T> via método CompareTo.

A classe List<T> fornece um método BinarySearch para realizar uma pesquisa nos elementos dessa lista. Os elementos são comparados com um objeto passado para o método BinarySearch no parâmetro do objeto.

A classe SortedList não tem um método BinarySearch de pesquisa; em vez disso, ela possui o método ContainsKey, que executa uma pesquisa binária na chave contida na lista.

O método ContainsValue da classe SortedList executa uma pesquisa linear ao pesquisar valores. Esta pesquisa linear usa o método Equals dos elementos na coleção SortedList para fazer seu trabalho. 

Os métodos Compare e CompareTo não têm nenhum efeito na operação da pesquisa linear realizada na classe SortedList, mas eles têm um efeito na pesquisa binária.

Assim neste exemplo vamos implementar a interface IComparable<T> na classe e e usar as as rotinas de pesquisa das classes List<T> e SortedList<K, V>.

Vejamos a aplicação disso em um cenário prático.

Vamos criar um projeto Console do tipo .Net Core e a seguir criar uma classe Quadrado no projeto:

A seguir vamos criar uma classe ComparaAlturaQuadrado que implementa a interface IComparer<T> onde vamos comparar as alturas de 2 objetos quadrado para realizar a ordenação.

Agora basta definir um método onde vamos criar uma lista de objetos Quadrado que desejamos ordenar e definir uma instância da classe ComparaAlturaQuadrado como sendo do tipo IComparer<Quadrado>.

Para ordenar usamos o método Sort da lista :


Executando o código teremos o resultado abaixo exibindo a lista original e a lista ordenada:


Pegue o projeto aqui:  CShp_Searchable.zip

"Bom é ter esperança, e aguardar em silêncio a salvação do Senhor."
Lamentações 3:26

Referências:


José Carlos Macoratti