1

DataTable insertRowsキーなしでデータを正規化したいのですが。そのためには、ID()を見つけて、重複するレコードを識別してマークを付ける必要がありますimport_id。その後、個別のもののみを選択します。私が考えているアプローチは、各行をそのDataTableのすべての行と比較することです insertRows

DataTableの列は設計時には不明であり、キーはありません。パフォーマンス面では、テーブルには10kから20kのレコードと約40の列があります

パフォーマンスをあまり犠牲にせずにこれを達成するにはどうすればよいですか?

linqを使用しようとしましたが、where基準を動的に指定する方法がわかりませんでした。ここでは、各行のループで名前と名前を比較しています。

foreach (System.Data.DataRow lrows in importDataTable.Rows)
{
    IEnumerable<System.Data.DataRow> insertRows = importDataTable.Rows.Cast<System.Data.DataRow>();

    var col_matches =
    from irows in insertRows
    where
    String.Compare(irows["fname"].ToString(), lrows["fname"].ToString(), true).Equals(0)
    &&
    String.Compare(irows["last_name"].ToString(), lrows["last_name"].ToString(),true).Equals(0)

    select new { import_id = irows["import_id"].ToString() };
}

どんなアイデアでも大歓迎です。linqを使用して類似の列名を見つけるにはどうすればよいですか?>類似の質問

4

3 に答える 3

2

O(n 2 ) の複雑さなしにこれを行う最も簡単な方法は、Set 操作、特に Contains 操作を効率的に実装するデータ構造を使用することです。幸い、.NET (3.0 以降) には、これを行うHashSetオブジェクトが含まれています。これを利用するには、DataTable の行をカプセル化する単一のオブジェクトが必要になります。

DataRow が機能しない場合は、関連するレコードを文字列に変換し、それらを連結してから HashSet に配置することをお勧めします。行を挿入する前に、(Contains を使用して) HashSet に既に含まれているかどうかを確認します。存在する場合は、重複が見つかりました。

編集:

このメソッドは O(n) です。

于 2009-03-20T14:27:44.073 に答える
1

質問を正しく理解しているかどうかはわかりませんが、System.Data.DataTable を扱う場合は次のように動作するはずです。

for (Int32 r0 = 0; r0 < dataTable.Rows.Count; r0++)
{
   for (Int32 r1 = r0 + 1; r1 < dataTable.Rows.Count; r1++)
   {
      Boolean rowsEqual = true;

      for (Int32 c = 0; c < dataTable.Columns.Count; c++)
      {
         if (!Object.Equals(dataTable.Rows[r0][c], dataTable.Rows[r1][c])
         {
            rowsEqual = false;
            break;
         }
      }

      if (rowsEqual)
      {
         Console.WriteLine(
            String.Format("Row {0} is a duplicate of row {1}.", r0, r1))
      }
   }
}
于 2009-03-19T21:56:32.130 に答える
0

私は LINQ についてあまり詳しくありませんが、.Distinct() 演算子を使用できますか?

http://blogs.msdn.com/charlie/archive/2006/11/19/linq-farm-group-and-distinct.aspx

あなたの質問では、重複行を明確に特定する必要があるのか​​ 、それともクエリからそれらを削除しようとしているだけなのかが明確ではありません。「Distinct」を追加すると、余分なインスタンスが削除されますが、それらが何であるかは必ずしもわかりません。

于 2009-03-20T14:23:10.293 に答える