Parallel ForEach on DataTable

前端 未结 5 1120
北荒
北荒 2020-12-04 19:27

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:

           


        
相关标签:
5条回答
  • 2020-12-04 19:38

    I had to modify Jon Skeet's answer to make it work.

    Parallel.ForEach(dt.AsEnumerable<DataRowType>(), drow => {
         drow.SomeCol = "";
    });
    
    0 讨论(0)
  • 2020-12-04 19:38

    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"));
                });
    
    0 讨论(0)
  • 2020-12-04 19:39

    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 => ...
    
    0 讨论(0)
  • 2020-12-04 19:43

    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
        ...
    });
    
    0 讨论(0)
  • 2020-12-04 19:50

    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.

    0 讨论(0)
提交回复
热议问题