从数据表中删除重复和自定义的IEqualityComparer <的DataRow>
-
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