Rimuovere i duplicati da DataTable e personalizzato IEqualityComparer
-
22-09-2019 - |
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()
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