質問

どのように私は次の構造を持つIEqualityComparer<DataRow>から重複行を削除するDataTableを実装する必要があります:

ID primary key, col_1, col_2, col_3, col_4
各行は、それ自身の、ユニークなプライマリキーを持っているので、

は既定の比較ではなく作業を行います。

主キーをスキップしてデータだけを比較しますIEqualityComparer<DataRow>を実装する方法

は残っています。

私はこのようなものを持っています:

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

public static DataTable RemoveDuplicates(this DataTable table)
{
  return
    (table.Rows.Count > 0) ?
  table.AsEnumerable().Distinct(new DataRowComparer()).CopyToDataTable() :
  table;
}

しかし、それは唯一のGetHashCode()を呼び出し、呼び出さないEquals()

役に立ちましたか?

解決

Distinctが動作する方法です。 IntenallyそれはGetHashCodeメソッドを使用しています。あなたが必要なものを行うにはGetHashCodeを書くことができます。

のようなもの
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;
}

あなたはもっと自分のデータを知っているので、あなたはおそらく、ハッシュを生成するためのより良い方法を考え出すことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top