如何用等效委托替换Linq的Where子句中编写的lambda

时间:2010-09-17 06:32:29

标签: linq delegates lambda

我有一个Query表达式,它使用谓词类型和lambda表达式。 我得到了理想的结果。但我不清楚如何评估这个表达式。

我尝试通过使用委托类型在Where下创建委托和替换条件来打破这个lambda表达式。

如果我必须通过编写委托而不是匿名类型来重写相同的东西。什么是语法。代表将如何返回。

if (((DataTable)dgvAssignedRpm.DataSource).AsEnumerable()
    .Where(row => row.Field<long>("FK_RPM_BTN_SETTING_ID") == objRpmButtonHolder.RpmSettingId).Count() > 1)
{
  List<DataRow> listPkgBtnSettings = SearchForExistingSettingId();
}

2 个答案:

答案 0 :(得分:1)

我认为正确的委托替换将是:

        if (((DataTable)dgvAssignedRpm.DataSource).AsEnumerable().Where(
            delegate(DataRow row) {
                return (row.Field<long>("FK_RPM_BTN_SETTING_ID") == objRpmButtonHolder.RpmSettingId.Count() > 1); 
            }))
        {
            List<DataRow> listPkgBtnSettings = SearchForExistingSettingId();
        }

但现在是我的早晨,如果我有点离开,请原谅我。

欲望的地方是将DataRow作为参数并返回bool。你可以填写lambda或delegate中的任何内容,只要它匹配这些请求。

问你为何要求Func&lt;&gt;以及它是如何工作的。您使用的语句是LINQ,所以我找到了一个关于这个的参考,这可能比我更好地解释它: http://blogs.msdn.com/b/mirceat/archive/2008/03/13/linq-framework-design-guidelines.aspx

但是,这是Func&lt;&gt;中的最后一种类型它是什么回报。 (但是,我仍然可以推荐使用Lambda表达式,因为它非常干净,整洁并且提供Func&lt;&gt;最佳。

(另外,看看当你写“new Func&lt; ....”时会有什么智慧,它应该让你对Func想要和能做的事情有所了解!)

希望我有所帮助。

答案 1 :(得分:1)

void MethodSignature(...) 
{ 
  ...  

  if (((DataTable)dgvAssignedRpm.DataSource).AsEnumerable()
    .Where(RowCondition)
  {
    List<DataRow> listPkgBtnSettings = SearchForExistingSettingId();
  }

  ...
}

// Where want a Func<T,bool> parameter 
// T is the first parameter type (DataRow here)
// bool represents the return value
bool RowCondition(DataRow row)
{
  return row.Field<long>("FK_RPM_BTN_SETTING_ID") == objRpmButtonHolder.RpmSettingId).Count() > 1
}