DataTable上的并行ForEach

Sch*_*tzE 50 parallel-processing c#-4.0

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

        foreach(DataRow drow in dt.Rows)
        {
           ...
           Do Stuff
           ...
        }
Run Code Online (Sandbox Code Playgroud)

对于这段代码:

        System.Threading.Tasks.Parallel.ForEach(dt.Rows, drow =>
                {
                    ...
                    Do Stuff
                    ...
                });
Run Code Online (Sandbox Code Playgroud)

当我运行新代码时,我收到错误:

无法从用法中推断出方法'System.Threading.Tasks.Parallel.ForEach(System.Collections.Generic.IEnumerable,System.Action)'的类型参数.尝试显式指定类型参数.

这个的正确语法是什么?

Jon*_*eet 106

DataTable.Rows返回DataRowCollection只实现的IEnumerable,而不是IEnumerable<DataRow>.使用AsEnumerable()扩展方法on DataTable(from DataTableExtensions)代替:

Parallel.ForEach(dt.AsEnumerable(), drow =>
{
    ...
    Do Stuff
    ...
});
Run Code Online (Sandbox Code Playgroud)

  • D'哦!击败拳击(仅仅几秒钟)! (3认同)
  • 确保引用System.Data.DataSetExtensions (2认同)
  • 请注意,DataTable不是线程安全的.您可能会遇到"内部索引已损坏"错误./sf/ask/31547281/ (2认同)

Kev*_*NET 11

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

 Parallel.ForEach(dt.Rows.Cast<DataRow>(), dr =>
Run Code Online (Sandbox Code Playgroud)

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

  • 但请记住这一点,来自 [Cast docs](https://msdn.microsoft.com/en-us/library/bb341406(v=vs.110).aspx):“如果无法将元素强制转换为类型 TResult ,此方法将引发异常。要仅获取可以强制转换为 TResult 类型的元素,请使用 OfType&lt;TResult&gt; 方法而不是 Cast&lt;TResult&gt;(IEnumerable)。 (2认同)

Jar*_*ger 8

Parallel.ForEach()期望第一个参数是IEnumerable <>类型.DataTable.Rows不是,但您可以使用AsEnumerable()扩展方法将其转换为一个.尝试:

... Parallel.ForEach(dt.AsEnumerable(), drow => ...
Run Code Online (Sandbox Code Playgroud)