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