1

異なるデータ オブジェクト間の差分を実行できるようにする「調整」ライブラリを実装しています。実装の一環として、比較するオブジェクト (ほとんどの場合 CSV ファイル) をデータテーブルに変換し、行の実際の値を比較する最後のステップと比較する特定のステップを実行しています。

行比較を行うために、以下のコードを使用しています。

  var rowsMissingInTrgt = rowsInTrgt.Except(rowsInSrc, DataRowComparer.Default);
  var rowsMissingInSrc = rowsInSrc.Except(rowsInTrgt, DataRowComparer.Default);
  return rowsMissingInSrc.Count() > 0 ? false : 
         rowsMissingInTrgt.Count() > 0 ? false : 
         true;

デフォルトの DataRowComparer を使用する代わりに、カスタムの DataRowComparer を実装したいと考えていますが、これらのタスクは互いに独立しており、最後に比較で logical_AND または logical_OR のいずれかを実行するオプションを提供するため、すべての比較を並行して実行したいと考えています。タスク。

質問:

  1. " " の実装はIEqualityComparer<TRow>where TRow : DataRow、行の並列比較を呼び出すのに十分ですか?

  2. logical_AND については、最初の「false」で残りの比較を中止するのが理にかなっていると思います。これはできますか?

  3. logical_OR の場合、スレッドで wait_All に似たものが必要になります。これはどのように実装できますか?

4

1 に答える 1

0

IEnumerable<T>.AsParallel()ソースコレクションとターゲットコレクションに使用します。

DataTable sourceTable;
DataTable targetTable;

// run each collection as parallel.
var sourceRows = sourceTable.Rows.Cast<DataRow>().AsParallel();
var targetRows = targetTable.Rows.Cast<DataRow>().AsParallel();

var rowsMissingInTarget = sourceRows.Except(targetRows, DataRowComparer.Default);
var rowsMissingInSource = targetRows.Except(sourceRows, DataRowComparar.Default);

並列処理は行コレクションに適用され、比較自体には適用されません。たとえば、100kレコードのテーブルでは、2つ(またはそれ以上)のスレッドを使用して処理を実行でき、それぞれが50kの比較を実行します。いくつかのパフォーマンステストを行うことをお勧めします。各行の比較は非常に高速であるため、この場合、実際には行の並列処理が遅くなると思われます。

于 2012-08-10T14:04:05.270 に答える