Eliminar duplicidade de uma coleção de objetos nunca foi tão fácil. O método Distinct do Linq tem o objetivo de eliminar as duplicidades.
Existe também uma interface chamada IEqualityComparer que auxiliará na eliminação dos objetos duplicados através da comparação objeto a objeto. Para tal, só precisamos implementar esta interface.
Como o método Distinct utiliza a interface IEqualityComparer
A Interface IEqualityComparer(T) define dois métodos :
bool Equals(T x, T y);
int GetHashCode(T obj);
A Interface IEqualityComparer(T) e analisada da seguinte forma quando utilizada pelo método Distinct.
O método GetHashCode e o primeiro método analisado se o valor retornado for único, não será necessário analisar o método Equals, caso o valor de retorno do método GetHashCode não seja único o método Equals será analisado, o retorno do método Equals definir se os objetos passados como parâmetros são iguais (True) ou não (False).
Implementando IEqualityComparer(T)
Vamos utilizar o método Distinct em uma coleção de objetos TB_VERSAO_GERACAO que é uma tabela do DataContext do LINQ, para fazer isso precisamos implementar a interface IEqualityComparer(T).
Conforme código abaixo, adicione uma classe ao projeto, altere o nome para VersaoGeracaoComparer e implemente a interface IEqualityComparer(T).
Na implementação da classe VersaoGeracaoComparer note que utilizamos um padrão de projeto Singleton , e por esse motivo o HashCode do objeto VersaoGeracaoComparer que terá apenas uma instância será utilizado com retorno para o método GetHashCode.
No método Equals cada propriedade dos objetos passados como parâmetro são comparadas entre si para determinar se os objetos são iguais ou diferentes.
/*
* -------------------- Empresa de INFORMÁTICA LTDA --------------------------
* CLASSE:
* AUTOR: FÉLIX, WILLON
* DATA CRIAÇÃO: 13/11/2008
* DESCRICAO:
*
* MODIFICADO POR:
* DATA MODIFICAÇÃO:
* ------------------------------------------------------------------------------------------
*/
namespace Empresa .Projeto.TOB
{
using System.Collections.Generic;
///
/// Classe de comparação de objetos.
///
public class VersaoGeracaoComparer : IEqualityComparer<TB_VERSAO_GERACAO>
{
#region Atributos
private static VersaoGeracaoComparer versaoGeracaoComparer;
#endregion
///Operação do padrão Singleton
public static VersaoGeracaoComparer Default
{
get
{
if (versaoGeracaoComparer == null)
versaoGeracaoComparer = new VersaoGeracaoComparer();
return versaoGeracaoComparer;
}
}
#region IEqualityComparer Members
public bool Equals(TB_VERSAO_GERACAO x, TB_VERSAO_GERACAO y)
{
return x.DS_LABEL == y.DS_LABEL;
}
public int GetHashCode(TB_VERSAO_GERACAO obj)
{
return versaoGeracaoComparer.GetHashCode();
}
#endregion
}
}
Utilizando Distinct na coleção de objetos TB_VERSAO_GERACAO
Vamos aos testes da implementação da interface IEqualityComparer(T).
Conforme código abaixo, criamos uma lista do tipo do objeto que estamos manipulando. Esta lista quardará os objetos já filtrados pelo método Distinct com auxilio da classe VersaoGeracaoComparer.
/*Busca a lista do banco*/
Lis<TB_VERSAO_GERACAO>t listaResultado = VersaoGeracaoDAL.ListListar();
List<TB_VERSAO_GERACAO> listaRetorno = new List<TB_VERSAO_GERACAO>();
foreach (TB_VERSAO_GERACAO item in listaResultado. Distinct (VersaoGeracao Comparer.Default))
{
listaRetorno.Add(item);
}
Eliminar duplicidades em coleções de objetos não é mais um bicho de sete cabeças. O Framework .Net facilitou a sua vida com a interface IEqualityComparer(T).
Willon Santos Félix
Existe também uma interface chamada IEqualityComparer que auxiliará na eliminação dos objetos duplicados através da comparação objeto a objeto. Para tal, só precisamos implementar esta interface.
Como o método Distinct utiliza a interface IEqualityComparer
A Interface IEqualityComparer(T) define dois métodos :
bool Equals(T x, T y);
int GetHashCode(T obj);
A Interface IEqualityComparer(T) e analisada da seguinte forma quando utilizada pelo método Distinct.
O método GetHashCode e o primeiro método analisado se o valor retornado for único, não será necessário analisar o método Equals, caso o valor de retorno do método GetHashCode não seja único o método Equals será analisado, o retorno do método Equals definir se os objetos passados como parâmetros são iguais (True) ou não (False).
Implementando IEqualityComparer(T)
Vamos utilizar o método Distinct em uma coleção de objetos TB_VERSAO_GERACAO que é uma tabela do DataContext do LINQ, para fazer isso precisamos implementar a interface IEqualityComparer(T).
Conforme código abaixo, adicione uma classe ao projeto, altere o nome para VersaoGeracaoComparer e implemente a interface IEqualityComparer(T).
Na implementação da classe VersaoGeracaoComparer note que utilizamos um padrão de projeto Singleton , e por esse motivo o HashCode do objeto VersaoGeracaoComparer que terá apenas uma instância será utilizado com retorno para o método GetHashCode.
No método Equals cada propriedade dos objetos passados como parâmetro são comparadas entre si para determinar se os objetos são iguais ou diferentes.
/*
* -------------------- Empresa de INFORMÁTICA LTDA --------------------------
* CLASSE:
* AUTOR: FÉLIX, WILLON
* DATA CRIAÇÃO: 13/11/2008
* DESCRICAO:
*
* MODIFICADO POR:
* DATA MODIFICAÇÃO:
* ------------------------------------------------------------------------------------------
*/
namespace Empresa .Projeto.TOB
{
using System.Collections.Generic;
///
/// Classe de comparação de objetos.
///
public class VersaoGeracaoComparer : IEqualityComparer<TB_VERSAO_GERACAO>
{
#region Atributos
private static VersaoGeracaoComparer versaoGeracaoComparer;
#endregion
///Operação do padrão Singleton
public static VersaoGeracaoComparer Default
{
get
{
if (versaoGeracaoComparer == null)
versaoGeracaoComparer = new VersaoGeracaoComparer();
return versaoGeracaoComparer;
}
}
#region IEqualityComparer Members
public bool Equals(TB_VERSAO_GERACAO x, TB_VERSAO_GERACAO y)
{
return x.DS_LABEL == y.DS_LABEL;
}
public int GetHashCode(TB_VERSAO_GERACAO obj)
{
return versaoGeracaoComparer.GetHashCode();
}
#endregion
}
}
Utilizando Distinct na coleção de objetos TB_VERSAO_GERACAO
Vamos aos testes da implementação da interface IEqualityComparer(T).
Conforme código abaixo, criamos uma lista do tipo do objeto que estamos manipulando. Esta lista quardará os objetos já filtrados pelo método Distinct com auxilio da classe VersaoGeracaoComparer.
/*Busca a lista do banco*/
Lis<TB_VERSAO_GERACAO>t listaResultado = VersaoGeracaoDAL.ListListar();
List<TB_VERSAO_GERACAO> listaRetorno = new List<TB_VERSAO_GERACAO>();
foreach (TB_VERSAO_GERACAO item in listaResultado. Distinct (VersaoGeracao Comparer.Default))
{
listaRetorno.Add(item);
}
Eliminar duplicidades em coleções de objetos não é mais um bicho de sete cabeças. O Framework .Net facilitou a sua vida com a interface IEqualityComparer(T).
Willon Santos Félix
Comentários