Reputation: 2628
I would like to use the new Parallel.ForEach function to loop through a datatable and perform actions on each row. I am trying to convert the code below:
foreach(DataRow drow in dt.Rows)
{
...
Do Stuff
...
}
To this code:
System.Threading.Tasks.Parallel.ForEach(dt.Rows, drow =>
{
...
Do Stuff
...
});
When I run the new code I get the error:
The type arguments for method 'System.Threading.Tasks.Parallel.ForEach(System.Collections.Generic.IEnumerable, System.Action)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
What is the correct syntax for this?
Upvotes: 60
Views: 73152
Reputation: 187
This way we can use Parallel.ForEach for Data table.
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"));
});
Upvotes: 1
Reputation: 1810
I had to modify Jon Skeet's answer to make it work.
Parallel.ForEach(dt.AsEnumerable<DataRowType>(), drow => {
drow.SomeCol = "";
});
Upvotes: 0
Reputation: 473
This is better than the accepted answer because this does not need to reference System.Data.DataSetExtensions:
Parallel.ForEach(dt.Rows.Cast<DataRow>(), dr =>
To use ForEach with a non-generic collection, you can use the Cast extension method to convert the collection to a generic collection, as shown in this example.
Upvotes: 19
Reputation: 7183
Parallel.ForEach() expects the first argument to be an IEnumerable<> type. DataTable.Rows is not, but you can turn it into one with the AsEnumerable() extension method. Try:
... Parallel.ForEach(dt.AsEnumerable(), drow => ...
Upvotes: 8
Reputation: 1502825
DataTable.Rows
returns a DataRowCollection
which only implements IEnumerable
, not IEnumerable<DataRow>
. Use the AsEnumerable()
extension method on DataTable
(from DataTableExtensions
) instead:
Parallel.ForEach(dt.AsEnumerable(), drow =>
{
...
Do Stuff
...
});
Upvotes: 127