LINQ在DataTable上选择distinct不起作用

Joh*_*tos 3 c# linq vb.net 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>
Run Code Online (Sandbox Code Playgroud)

而我正试图获得不同的行:

Col1:    Col2:    Col3:    Col4:
1        abc      def      <null>
2        abc      def      ghi
3        abc      def      <null>
Run Code Online (Sandbox Code Playgroud)

我尝试了以下LINQ语句:

MyTable = (From dr As DataRow In MyTable Select dr).Distinct.CopyToDataTable
Run Code Online (Sandbox Code Playgroud)

但它将原始数据表返回给我重复的行.

我做错了什么以及如何获得我想要的输出?

Ser*_*rvy 6

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)