当前位置:  开发笔记 > 小程序 > 正文

DataTable上的并行ForEach

如何解决《DataTable上的并行ForEach》经验,为你挑选了3个好方法。

我想使用新的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)'的类型参数.尝试显式指定类型参数.

这个的正确语法是什么?



1> Jon Skeet..:

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

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


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

2> Kevin .NET..:

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

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

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



3> JaredReising..:

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

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

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有