簡體   English   中英

在DataRow集合上調用Distinct()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM