我有一个从 CSV 文件加载的数据表。我需要根据数据表中的两列(product_id
和owner_org_id
)确定哪些行是重复的。一旦我确定了这一点,我就可以使用该信息来构建我的结果,这是一个仅包含非唯一行的数据表,以及一个仅包含唯一行的数据表。
我在这里查看了其他示例,到目前为止我提出的代码确实可以编译和执行,但似乎认为数据中的每一行都是唯一的。实际上,在测试数据中有 13 行,只有 6 行是唯一的。很明显我做错了什么。
编辑:我想我应该注意,应该全部删除具有重复项的行,而不仅仅是该行的重复项。例如,如果有 4 个重复项,则应删除所有 4 个而不是 3 个,从 4 个中保留一个唯一行。
EDIT2:或者,如果我可以选择所有重复的行(而不是尝试选择唯一的行),那对我来说很好。无论哪种方式都可以让我得到最终结果。
处理方法中的代码:
MyRowComparer myrc = new MyRowComparer();
var uniquerows = dtCSV.AsEnumerable().Distinct(myrc);
以及以下内容:
public class MyRowComparer : IEqualityComparer<DataRow>
{
public bool Equals(DataRow x, DataRow y)
{
//return ((string.Compare(x.Field<string>("PRODUCT_ID"), y.Field<string>("PRODUCT_ID"), true)) ==
// (string.Compare(x.Field<string>("OWNER_ORG_ID"), y.Field<string>("OWNER_ORG_ID"), true)));
return
x.ItemArray.Except(new object[] { x[x.Table.Columns["PRODUCT_ID"].ColumnName] }) ==
y.ItemArray.Except(new object[] { y[y.Table.Columns["PRODUCT_ID"].ColumnName] }) &&
x.ItemArray.Except(new object[] { x[x.Table.Columns["OWNER_ORG_ID"].ColumnName] }) ==
y.ItemArray.Except(new object[] { y[y.Table.Columns["OWNER_ORG_ID"].ColumnName] });
}
public int GetHashCode(DataRow obj)
{
int y = int.Parse(obj.Field<string>("PRODUCT_ID"));
int z = int.Parse(obj.Field<string>("OWNER_ORG_ID"));
int c = y ^ z;
return c;
}
}