Construtor de EqualityComparer

Tango.Linq.EqualityComparerBuilder<T>

Esta classe implementa a interface IEqualityComparer<T> e tem o objetivo principal prover um método de criação para objetos concretos que implementam esta interface de comparação.

Com isso é possível utilizar métodos como o Distinct do namespace System.Linq de forma dinâmica e realizando qualquer tipo de comparação, mesmo entre objetos do mesmo tipo.

Caso a interface fosse implementada diretamente na classe que será comparada, haveria apenas uma de forma de realizar uma comparação entre objetos desta classe.

Com esta implementação torna-se possível implementar comparações genéricas.

Propriedades

Nome Tipo Descrição
Comparer Func<T, T, bool> Propriedade para armazenar o método que será utilizado para realizar a comparação entre os objetos.
HashCodeGetter Func<T, int> Propriedade para armazenar o método que será utilizado para realizar a operação para obter o HashCode do objeto.

Métodos

Nome Parâmetros Retorno Descrição
Create Func<T, T, bool> comparer

Func<T, int> hashCodeGetter

EqualityComparerBuilder Cria uma nova instância deste objeto encapsulando as funções informadas no parâmetro para executar os métodos da interface IEqualityComparer<T>.
Equals T x

T y

bool Método da interface IEqualityComparer<T>.
GetHashCode T obj int Método da interface IEqualityComparer<T>.

Como Usar

Para criar uma nova instância de um comparador basta utilizar o método estático Create informando as funções que devem ser utilizadas na comparação do objeto.

Veja o exemplo a seguir:

class Product
{
   public int Id { get; set; }
   public string Description { get; set; }
}

Func<Product, Product, bool> compareProducts = 
      (product1, product2) => product1.Id == product2.Id;

Func<Product, int> getHashCodeProduct =
      product => product.Id.GetHashCode();

var comparer = 
    EqualityComparerBuilder<Product>.Create(
        compareProducts, 
        getHashCodeProduct);

IEnumerable<Product> products = GetProducts();
products.Distinct(comparer);

No exemplo anterior, o método Distinct não levará mais em conta a refêrencia do objeto Product, mas sim as comparações feitas através do objeto comparer.

Você também pode informar os métodos anônimos diretamente no parâmetro do método Create:

class Product
{
   public int Id { get; set; }
   public string Description { get; set; }
}
IEnumerable<Product> products = GetProducts();
products.Distinct(
    EqualityComparerBuilder<Product>.Create(
            (product1, product2) => product1.Id == product2.Id, 
            product => product.Id.GetHashCode());
);

results matching ""

    No results matching ""