尝试使用Distinct()扩展方法在数据表中查找唯一行。某些行包含完全相同的数据,但由于某些原因,这些行的哈希码彼此不同。
我写了一个实现IEqualityComparer<DataRow>
的比较器类,但是,我认为我在GetHashCode()
所做的事情是俗气而讨厌的。
我这样做的原因是因为Equals()
永远不会被调用,除非哈希码是相同的(预期行为)
class RowValidationComparer : IEqualityComparer<DataRow>
{
public bool Equals(DataRow x, DataRow y)
{
return x.Field<string>("MyField").Equals(y.Field<string>("MyField"));
}
public int GetHashCode(DataRow obj)
{
typeof(DataRow).GetHashCode();
}
}
答案 0 :(得分:4)
尝试使用Distinct()扩展方法在数据表中查找唯一行。
为此,您可以使用DataRowComparer类:
var distinct = dataTable.AsEnumerable().Distinct(DataRowComparer.Default);
有关MSDN的一般解释,讨论在DataRows上使用集合运算符,例如Distinct:
这些运算符通过在每个元素集合上调用GetHashCode和Equals方法来比较源元素。对于DataRow,这些运算符执行参考比较,这通常不是表格数据上的集合操作的理想行为。对于set操作,通常需要确定元素值是否相等而不是元素引用。因此,DataRowComparer类已添加到LINQ to DataSet。该类可用于比较行值。
DataRowComparer类包含DataRow的值比较实现,因此该类可用于设置操作,例如Distinct。
答案 1 :(得分:2)
你可以试试......
public int GetHashCode(DataRow obj) {
return obj.Field<string>("MyField").GetHashCode();
}
您添加到哈希码值的字段越多越复杂。此外,您可能希望添加空引用检查。