c# - LINQ Select distinct on DataTable 不工作

标签 c# vb.net linq datatable

我有以下数据表 - 假设名为 MyTable:

Col1:    Col2:    Col3:    Col4:
1        abc      def      <null>
2        abc      def      ghi
1        abc      def      <null>
3        abc      def      <null>
1        abc      def      <null>

我正在尝试获取不同的行:

Col1:    Col2:    Col3:    Col4:
1        abc      def      <null>
2        abc      def      ghi
3        abc      def      <null>

我尝试了以下 LINQ 语句:

MyTable = (From dr As DataRow In MyTable Select dr).Distinct.CopyToDataTable

但它会将包含重复行的原始数据表返回给我。

我做错了什么以及我怎样才能得到我想要的输出??

最佳答案

Distinct 依赖于所有实现 IEquatable 和/或具有 GetHashCodeEquals 的合理实现的对象。 DataRow 类...没有。它不会在Equals方法中检查每列的值是否相等,它只是使用默认的实现,也就是说它检查引用是否相等,这不是你的意思想要。

您可以提供自己的 IEqualityComparer,因为您无法更改 DataRow 中的方法。

如果您将它的一个实例提供给 Distinct,那么下面应该可以工作:

public class DataRowComparer : IEqualityComparer<DataRow>
{
    public bool Equals(DataRow x, DataRow y)
    {
        for (int i = 0; i < x.Table.Columns.Count; i++)
        {
            if (!object.Equals(x[i], y[i]))
                return false;
        }
        return true;
    }

    public int GetHashCode(DataRow obj)
    {
        unchecked
        {
            int output = 23;
            for (int i = 0; i < obj.Table.Columns.Count; i++)
            {
                output += 19 * obj[i].GetHashCode();
            }
            return output;
        }
    }
}

关于c# - LINQ Select distinct on DataTable 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14165335/

相关文章:

c# - 使用 OpenOffice 进行邮件合并

c# - 使用 URL 调用默认浏览器并设置目标

linq - 无法将原始 SQL 查询映射到 DataRow

c# - LINQ 查询中的 List<T>.Contains(T) 出错

c# - 无法在 python 中使用 X509Certificate 签署数据

C# Oledb like 语句不返回任何结果

mysql - vb.net 更新用户按钮在使用 mysql 时不起作用

wpf - 简单的 MVVM 绑定(bind)问题

arrays - 将文本分割成二维数组

c# - 如何使这两种方法更有效