Eliminar duplicados de DataTable y costumbre IEqualityComparer
-
22-09-2019 - |
Pregunta
¿Cómo he de implementar IEqualityComparer<DataRow>
para eliminar duplicados filas de una DataTable
con el siguiente estructura:
ID primary key, col_1, col_2, col_3, col_4
El comparador predeterminado no funciona debido a que cada fila tiene su propia clave principal, único.
Cómo implementar IEqualityComparer<DataRow>
que saltar clave principal y comparar sólo quedaban los datos.
Tengo algo como esto:
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();
}
}
y
public static DataTable RemoveDuplicates(this DataTable table)
{
return
(table.Rows.Count > 0) ?
table.AsEnumerable().Distinct(new DataRowComparer()).CopyToDataTable() :
table;
}
pero sólo llamadas GetHashCode()
y no llama Equals()
Solución
Esa es la obra Distinct
manera. Intenally que utiliza el método GetHashCode
. Puede escribir el GetHashCode
para hacer lo que necesita. Algo así 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;
}
Puesto que usted sabe mejor sus datos es probable que pueda llegar a una mejor manera de generar el hash.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow