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());
);

Last updated