从DataTable和自定义IEqualityComparer <datarow> </datarow>中删除重复项

时间:2009-10-21 08:32:58

标签: c# .net linq datatable iequalitycomparer

如何实施IEqualityComparer<DataRow>以从具有下一个结构的DataTable中删除重复行:

ID primary key, col_1, col_2, col_3, col_4

默认比较器不起作用,因为每行都有自己唯一的主键。

如何实现将跳过主键并仅比较剩余数据的IEqualityComparer<DataRow>

我有这样的事情:

public class DataRowComparer : IEqualityComparer<DataRow>
{
 public bool Equals(DataRow x, DataRow y)
 {
  return
   x.ItemArray.Except(new object[] { x[x.Table.PrimaryKey[0].ColumnName] }) ==
   y.ItemArray.Except(new object[] { y[y.Table.PrimaryKey[0].ColumnName] });
 }

 public int GetHashCode(DataRow obj)
 {
  return obj.ToString().GetHashCode();
 }
}

public static DataTable RemoveDuplicates(this DataTable table)
{
  return
    (table.Rows.Count > 0) ?
  table.AsEnumerable().Distinct(new DataRowComparer()).CopyToDataTable() :
  table;
}

但它只调用GetHashCode()而不调用Equals()

1 个答案:

答案 0 :(得分:5)

这就是Distinct的工作方式。它本身使用GetHashCode方法。您可以编写GetHashCode来执行您需要的操作。像

这样的东西
public int GetHashCode(DataRow obj)
{
    var values = obj.ItemArray.Except(new object[] { obj[obj.Table.PrimaryKey[0].ColumnName] });
    int hash = 0;
    foreach (var value in values)
    {
        hash = (hash * 397) ^ value.GetHashCode();
    }
    return hash;
}

由于您更了解数据,因此您可能会想出一种更好的方法来生成哈希值。