在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参数。

这是什么正确的语法?

3 Solutions collect form web for “在DataTable上并行ForEach”

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集合,如本例所示。

  • 如何在URL中对加号(+)进行编码
  • 可以在.Net 4.0中使用Tuple的实际示例?
  • 使用System.ComponentModel.DataAnnotations与entity framework4.0
  • C#4.0dynamic与扩展...他们在哪里适合?
  • 在SQL 2008types的C#longtypes
  • 我如何获得当前行号?
  • C#'dynamic'不能访问另一个程序集中声明的匿名types的属性
  • 如何检查一个属性是否存在于c#中的dynamic匿名types?
  • 使用ITextSharp提取和更新现有PDF中的链接
  • parsingmathexpression式
  • 协变和逆变现实世界的例子