![](/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.