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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top