カスタムされたIEqualityComparer <のDataRow>のDataTableから重複を削除し、
-
22-09-2019 - |
質問
どのように私は次の構造を持つ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;
}
あなたはもっと自分のデータを知っているので、あなたはおそらく、ハッシュを生成するためのより良い方法を考え出すことができます。
所属していません StackOverflow