c# – LINQ查询中的对象构造后立即调用方法
作者:互联网
我有一些实现这个接口的对象:
public interface IRow
{
void Fill(DataRow dr);
}
通常当我从db中选择一些东西时,我会去:
public IEnumerable<IRow> SelectSomeRows
{
DataTable table = GetTableFromDatabase();
foreach (DataRow dr in table.Rows)
{
IRow row = new MySQLRow(); // Disregard the MySQLRow type, it's not important
row.Fill(dr);
yield return row;
}
}
现在使用.Net 4,我想使用AsParallel,从而使用LINQ.
我已经对它进行了一些测试,并且它加速了很多东西(IRow.Fill使用Reflection,因此在CPU上很难)
无论如何我的问题是,我如何创建一个LINQ查询,它调用Fills作为查询的一部分,所以它是否正确并行化?
为了测试性能,我创建了一个构造函数,它将DataRow作为参数,但是如果可能的话,我真的很想避免这种情况.
有了构造函数,它显然很简单:
public IEnumerable<IRow> SelectSomeRowsParallel
{
DataTable table = GetTableFromDatabase();
return from DataRow dr in table.Rows.AsParallel()
select new MySQLRow(dr);
}
但是就像我说的,我真的很想能够将我的Fill方法填充到LINQ查询中,因此不需要构造函数重载.
解决方法:
你需要创建一个多语句lambda表达式,如下所示:
table.AsEnumerable().AsParallel().Select(dr =>
IRow row = new MySQLRow();
row.Fill(dr);
return row;
});
标签:c,linq-to-objects 来源: https://codeday.me/bug/20190606/1190920.html