我想使用新的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)'的类型参数。尝试明确指定类型参数。
这个的正确语法是什么?
答案 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"));
});