Construtor de EqualityComparer
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());
);