在DataTable上并行ForEach

我想使用新的Parallel.ForEach函数来遍历一个数据表,并对每一行执行操作。 我想转换下面的代码:

foreach(DataRow drow in dt.Rows) { ... Do Stuff ... } 

为了这个代码:

  System.Threading.Tasks.Parallel.ForEach(dt.Rows, drow => { ... Do Stuff ... }); 

当我运行新的代码时,出现错误:

方法“System.Threading.Tasks.Parallel.ForEach(System.Collections.Generic.IEnumerable,System.Action)”的types参数不能从使用中推断出来。 尝试明确指定types参数。

这是什么正确的语法?

DataTable.Rows返回一个DataRowCollection ,它只实现IEnumerable ,而不是IEnumerable<DataRow> 。 使用DataTable上的AsEnumerable()扩展方法(来自DataTableExtensions ):

 Parallel.ForEach(dt.AsEnumerable(), drow => { ... Do Stuff ... }); 

Parallel.ForEach()期望第一个参数是一个IEnumerable <>types。 DataTable.Rows不是,但可以用AsEnumerable()扩展方法把它变成一个。 尝试:

 ... Parallel.ForEach(dt.AsEnumerable(), drow => ... 

这比接受的答案更好,因为这不需要引用System.Data.DataSetExtensions:

  Parallel.ForEach(dt.Rows.Cast<DataRow>(), dr => 

要将ForEach与非generics集合一起使用,可以使用Cast扩展方法将集合转换为generics集合,如本例所示。