Question

Comment ai-je mettre en œuvre IEqualityComparer<DataRow> pour supprimer les lignes de doublons d'une DataTable avec la structure suivante:

ID primary key, col_1, col_2, col_3, col_4

Le comparateur par défaut ne fonctionne pas parce que chaque ligne a son propre, clé primaire unique.

Comment mettre en œuvre IEqualityComparer<DataRow> qui sautera clé primaire et ne comparer que les données sont restées.

J'ai quelque chose comme ceci:

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

et

public static DataTable RemoveDuplicates(this DataTable table)
{
  return
    (table.Rows.Count > 0) ?
  table.AsEnumerable().Distinct(new DataRowComparer()).CopyToDataTable() :
  table;
}

mais il appelle que GetHashCode() et ne remet pas Equals()

Était-ce utile?

La solution

C'est la façon dont fonctionne Distinct. Intenally il utilise la méthode GetHashCode. Vous pouvez écrire le GetHashCode pour faire ce que vous avez besoin. Quelque chose comme

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

Puisque vous savez que vos données mieux vous pouvez probablement trouver une meilleure façon de générer le hachage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top