Domanda

Come ho implementare IEqualityComparer<DataRow> per rimuovere i duplicati righe da una DataTable con successivo struttura:

ID primary key, col_1, col_2, col_3, col_4

L'operatore di confronto di default non funziona perché ogni riga ha il proprio chiave primaria unica,.

Come implementare IEqualityComparer<DataRow> che salterà chiave primaria e confrontare sono rimasti solo i dati.

ho qualcosa di simile a questo:

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;
}

ma solo chiamate GetHashCode() e non chiama Equals()

È stato utile?

Soluzione

Questo è il modo in cui le opere Distinct. Intenally si utilizza il metodo GetHashCode. È possibile scrivere il GetHashCode per fare quello che ti serve. Qualcosa di simile

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;
}

Poiché si sa i dati più probabilmente si può trovare un modo migliore per generare l'hash.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top