Remova as duplicatas de Datatable e personalizado iEqualityComparer
-
22-09-2019 - |
Pergunta
Como tenho para implementar IEqualityComparer<DataRow>
para remover duplicatas linhas de um DataTable
Com a próxima estrutura:
ID primary key, col_1, col_2, col_3, col_4
O comparador padrão não funciona porque cada linha possui sua própria chave primária única.
Como implementar IEqualityComparer<DataRow>
Isso irá pular a chave primária e comparar apenas os dados.
Eu tenho algo assim:
public class DataRowComparer : IEqualityComparer<DataRow>
{
public bool Equals(DataRow x, DataRow y)
{
return
x.ItemArray.Except(new object[] { x[x.Table.PrimaryKey[0].ColumnName] }) ==
y.ItemArray.Except(new object[] { y[y.Table.PrimaryKey[0].ColumnName] });
}
public int GetHashCode(DataRow obj)
{
return obj.ToString().GetHashCode();
}
}
e
public static DataTable RemoveDuplicates(this DataTable table)
{
return
(table.Rows.Count > 0) ?
table.AsEnumerable().Distinct(new DataRowComparer()).CopyToDataTable() :
table;
}
Mas chama apenas GetHashCode()
e não liga Equals()
Solução
Esse é o caminho Distinct
funciona. Intenalmente, ele usa o GetHashCode
método. Você pode escrever o GetHashCode
Para fazer o que você precisa. Algo como
public int GetHashCode(DataRow obj)
{
var values = obj.ItemArray.Except(new object[] { obj[obj.Table.PrimaryKey[0].ColumnName] });
int hash = 0;
foreach (var value in values)
{
hash = (hash * 397) ^ value.GetHashCode();
}
return hash;
}
Como você conhece melhor seus dados, provavelmente pode criar uma maneira melhor de gerar o hash.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow