DataTable上的并行ForEach

时间:2010-08-04 18:25:12

标签: c#-4.0 parallel-processing

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

这个的正确语法是什么?

5 个答案:

答案 0 :(得分:101)

DataTable.Rows会返回DataRowCollection,只会IEnumerable,而不是IEnumerable<DataRow>。使用DataTable上的AsEnumerable()扩展名方法(来自DataTableExtensions)代替:

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

答案 1 :(得分:11)

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

xAxis.setValueFormatter(new AxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
// here you can return whatever you want,
// for example you can return values from array, and use value argument as index
                return labels[value]);
            }

            @Override
            public int getDecimalDigits() {
                return 0;
            }
        });

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

答案 2 :(得分:8)

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

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

答案 3 :(得分:1)

我不得不修改Jon Skeet的答案,让它发挥作用。

Parallel.ForEach(dt.AsEnumerable<DataRowType>(), drow => {
     drow.SomeCol = "";
});

答案 4 :(得分:0)

这样,我们可以将Parallel.ForEach用于数据表。

DataTable dtTest = new DataTable();
            dtTest.Columns.Add("ID",typeof(int));
            dtTest.Columns.Add("Name", typeof(string));
            dtTest.Columns.Add("Salary", typeof(int));

            DataRow dr = dtTest.NewRow();
            dr["ID"] = 1;
            dr["Name"] = "Rom";
            dr["Salary"] = "2000";
            dtTest.Rows.Add(dr);

            dr = dtTest.NewRow();
            dr["ID"] = 2;
            dr["Name"] = "David";
            dr["Salary"] = "5000";
            dtTest.Rows.Add(dr);

            dr = dtTest.NewRow();
            dr["ID"] = 3;
            dr["Name"] = "Samy";
            dr["Salary"] = "1200";
            dtTest.Rows.Add(dr);

            Parallel.ForEach(dtTest.AsEnumerable(), drow =>
            {
                MessageBox.Show("ID " + drow.Field<int>("ID") + " " + drow.Field<string>("Name") + " " + drow.Field<int>("Salary"));
            });