Duplikate entfernen von Datatable und benutzerdefinierten IEqualityComparer
-
22-09-2019 - |
Frage
Wie habe ich IEqualityComparer<DataRow>
zu implementieren, um Duplikate Zeilen aus einem DataTable
mit folgenden Struktur zu entfernen:
ID primary key, col_1, col_2, col_3, col_4
Der Standardvergleich funktioniert nicht, weil jede Zeile seiner eigenen, einzigartigen Primärschlüssel hat.
Wie IEqualityComparer<DataRow>
zu implementieren, die Primärschlüssel überspringen wird und vergleichen Sie nur Daten geblieben.
Ich habe so etwas wie folgt aus:
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();
}
}
und
public static DataTable RemoveDuplicates(this DataTable table)
{
return
(table.Rows.Count > 0) ?
table.AsEnumerable().Distinct(new DataRowComparer()).CopyToDataTable() :
table;
}
, aber es ruft nur GetHashCode()
und stellt nicht Equals()
Lösung
Das ist die Art und Weise Distinct
funktioniert. Intenally verwendet es die GetHashCode
Methode. Sie können die GetHashCode
schreiben zu tun, was Sie brauchen. So etwas wie
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;
}
Da Sie wissen, Ihre Daten besser Sie wahrscheinlich mit einem besseren Weg kommen können den Hash zu erzeugen.