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

如何用等效委托替换Linq Where子句中编写的lambda,linq,delegates,lambda,Linq,Delegates,Lambda,我有一个使用谓词类型和lambda表达式的查询表达式。 我用这个得到了想要的结果。但我不清楚这个表达式是如何计算的 我试图通过创建委托并用委托类型替换Where下的条件来打破这个lambda表达式 如果我必须重写同样的东西,写一个委托而不是匿名类型。语法是什么。委托将如何返回相同的 if (((DataTable)dgvAssignedRpm.DataSource).AsEnumerable() .Where(row => row.Field<long>("FK_RPM

我有一个使用谓词类型和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();
}
if(((数据表)dgvAssignedRpm.DataSource).AsEnumerable()
.Where(row=>row.Field(“FK\u RPM\u BTN\u设置\u ID”)==objRpmButtonHolder.RpmSettingId.Count()>1)
{
List listPkgBtnSettings=SearchForExistingSettingId();
}

我认为正确的代理替换应该是:

        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();
        }
if(((DataTable)dgvAssignedRpm.DataSource).AsEnumerable()。其中(
委托(数据行){
返回(row.Field(“FK\u RPM\u BTN\u设置\u ID”)==objRpmButtonHolder.RpmSettingId.Count()>1);
}))
{
List listPkgBtnSettings=SearchForExistingSettingId();
}
但我现在是早上,所以如果我有点不舒服,请原谅我

where希望给出一个DataRow作为参数,并返回一个bool。您可以在lambda或委托中填写任何内容,只要它与这些请求相匹配

对于您的问题,它为什么要求Func以及它是如何工作的。您使用的语句是LINQ,因此我为您找到了一个关于这一点的参考,它可能比我更好地解释:

但是是的,Func中的最后一个类型是它返回的值。(但是,我仍然建议使用Lambda表达式,因为它非常干净、整洁,并且最适合Func

(另外,看看intellisence在编写“new Func
void MethodSignature(…)时提供了什么)
{ 
...  
if(((数据表)dgvAssignedRpm.DataSource).AsEnumerable()
.何处(路况)
{
List listPkgBtnSettings=SearchForExistingSettingId();
}
...
}
//在哪里需要Func参数
//T是第一个参数类型(此处为DataRow)
//bool表示返回值
布尔行条件(数据行)
{
返回row.Field(“FK\u RPM\u BTN\u SETTING\u ID”)==objRpmButtonHolder.RpmSettingId).Count()>1
}

当我查看where子句定义时,它要求使用函数()谓词。那么它意味着什么。它意味着什么。谓词中的最后一个参数,即代表委托的返回类型。我对吗?所描述的命名函数madgnome也为您提供了一个很好的示例。Func只要求签名,而Func本机最多支持16个参数和一个结果类型。您能提供这16个参数吗st.我已经搜索了一个小时了。我知道它支持16种类型,但不支持列表。很久以前我只见过一次。是的,在你编辑之后。我在每个地方都使用Lambda,但唯一的区别是我知道如何实现它们,但不清楚概念。这就是为什么我试图理解它们,这就是为什么我发布了这个问题.@Shantanu Gupta,我想我们在这里的意思完全相同。列表是像Func&Func to Func这样的重载(因此这里Lambda的主体将完全满足这些要求。(参数)=>{method's body with said return type.}您是如何认识到T是一个参数而不是返回类型的?反之亦然。是否有一些规则规定T中的最后一个参数始终是返回类型。如果我在这里说什么是返回类型。它是强制的吗int@Shantanu是的,根据定义,一个函数总是返回一个值,而在C#中只返回一个值,因此在任何
Func定义,最后一个类型是返回类型,其他所有类型都是参数。如果没有返回类型,则它不是函数,而是操作,因此使用
action
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
}