Comment ai-je mettre en œuvre IEqualityComparer<DataRow>
pour supprimer les lignes de doublons d'une DataTable
avec la structure suivante:Supprimer les doublons de DataTable et personnalisée IEqualityComparer <DataRow>
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, unique clé primaire.
Comment implémenter IEqualityComparer<DataRow>
qui ignorera la clé primaire et ne comparera que les données restantes.
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()
C'est toujours une bonne idée d'avoir vos fonctions égales et de hachage en synchronisation, par ex. égal ne devrait jamais retourner vrai lorsque les codes de hachage ne sont pas identiques. Btw. ma conjecture est que Equals() sera toujours appelé quand GetHashCode() retourne la même chose (puisque les hachages peuvent entrer en collision), donc vous pourriez peut-être tricher et retourner toujours un hash fictif. Mais ne le fais pas. – HerdplattenToni
Ce n'est pas seulement "une bonne idée", c'est une pratique recommandée. MSDN indique que les types qui remplacent Equals doivent également remplacer GetHashCode. " –
pourquoi exactement 397? Que diriez-vous d'utiliser la clé primaire si elle est un INT? – abatishchev