编程语言
首页 > 编程语言> > c# – LINQ查询中的对象构造后立即调用方法

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