Determinación de duplicados en un datatable
Tengo una tabla de datos que he cargado de un archivo CSV. Necesito determinar qué filas son duplicadas basadas en dos columnas (product_id
yowner_org_id
) en el datatable. Una vez que he determinado eso, puedo usar esa información para compilar mi resultado, que es una tabla de datos que contiene solo las filas que no son únicas, y una tabla de datos que contiene solo las filas que son únicas.
He visto otros ejemplos aquí y el código que he creado hasta ahora compila y ejecuta, pero parece pensar que cada fila en los datos es única. En realidad, en los datos de prueba hay 13 filas y solo 6 son únicas. Claramente estoy haciendo algo mal.
EDITAR: Pensé que debería tener en cuenta, las filas que tienen duplicados debenTODOS ser eliminado, no solo los duplicados de esa fila. por ejemplo, si hay 4 duplicados, los 4 deberían eliminarse, no 3, dejando una fila única de las 4.
EDIT2: Alternativamente, si puedo seleccionar todas las filas duplicadas (en lugar de tratar de seleccionar filas únicas), me parece bien. De cualquier manera puede llevarme a mi resultado final.
El código en el método de procesamiento:
MyRowComparer myrc = new MyRowComparer();
var uniquerows = dtCSV.AsEnumerable().Distinct(myrc);
junto con lo siguiente:
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;
}
}