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

¿Fue útil?

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
scroll top