6

次の構造を持つ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()

4

1 に答える 1

5

それがDistinct仕組みです。内部的には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;
}

データをよく知っているので、おそらくハッシュを生成するより良い方法を思い付くことができます。

于 2009-10-21T08:46:58.420 に答える