Supprimer les doublons de IEqualityComparer DataTable et sur mesure
-
22-09-2019 - |
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()
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.