繁体   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