CSV ファイルから読み込んだデータ テーブルがあります。product_id
データテーブルの 2 つの列 (と) に基づいて、どの行が重複しているかを判断する必要がありますowner_org_id
。これを決定したら、その情報を使用して結果を作成できます。これは、一意ではない行のみを含むデータ テーブルと、一意の行のみを含むデータ テーブルです。
ここで他の例を見てきましたが、これまでに思いついたコードはコンパイルして実行しますが、データのすべての行が一意であると考えているようです. 実際には、テスト データには 13 行あり、一意なのは 6 行だけです。明らかに、私は何か間違ったことをしています。
編集:私が注意すべきだと思ったのは、重複のある行は、その行の重複だけでなく、すべて削除する必要があるということです。たとえば、重複が 4 つある場合、3 つではなく 4 つすべてを削除し、4 つから 1 つの一意の行を残す必要があります。
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;
}
}