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,但希望所有比较并行发生,因为这些任务彼此独立,最后提供了在比较上执行逻辑与或逻辑或的可选性任务。

问题:

  1. 实现“ IEqualityComparer<TRow>where TRow : DataRow”是否足以调用行的并行比较?

  2. 对于logical_AND,我认为,在第一个“假”上中止其余比较是有意义的。这可以做到吗?

  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 回答