![](/img/trans.png)
[英]Concurrent threads calling same method leads to duplicates in ConcurrentBag<DataRow> collection
[英]Calling Distinct() on DataRow collection
尝试使用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();
}
}
尝试使用Distinct()扩展方法在数据表中查找唯一行。
为此,可以使用DataRowComparer类:
var distinct = dataTable.AsEnumerable().Distinct(DataRowComparer.Default);
对于MSDN的一般性解释,讨论了在DataRows上使用Distinct之类的集合运算符的用法:
这些运算符通过在每个元素集合上调用GetHashCode和Equals方法来比较源元素。 对于DataRow,这些运算符执行参考比较,这通常不是对表格数据进行设置操作的理想行为。 对于设置操作,通常需要确定元素值是否相等,而不是元素引用。 因此,DataRowComparer类已被添加到LINQ到DataSet中。 此类可用于比较行值。
DataRowComparer类包含DataRow的值比较实现,因此此类可用于诸如Distinct之类的设置操作。
您可以尝试...
public int GetHashCode(DataRow obj) {
return obj.Field<string>("MyField").GetHashCode();
}
添加到哈希码值中的字段越多,它就会变得越复杂。 另外,您可能要添加空引用检查。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.