【问题标题】:How to replace lambda written in Where clause of Linq with equivalent delegate如何用等效的委托替换在 Linq 的 Where 子句中编写的 lambda
【发布时间】:2010-09-17 06:32:29
【问题描述】:

我有一个使用谓词类型和 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();
}

【问题讨论】:

    标签: linq delegates lambda


    【解决方案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
    }
    

    【讨论】:

    • 您是如何认识到 T 是参数而不是返回类型,反之亦然。是否有一些规则, 中的最后一个参数始终是返回类型。如果我说 这里的返回类型是什么。是否应该强制为int
    • @Shantanu,是的,一个函数——根据定义——总是返回一个值,而在 C# 中只返回一个值,因此在任何 Func&lt;&gt; 定义中,最后一个类型是返回类型,并且所有其他人是为了争论。如果你有 no 返回类型,它不是一个函数,而是一个动作,所以你使用Action&lt;&gt;
    【解决方案2】:

    我认为正确的代表替换是:

            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 或委托中填写任何内容,只要它与这些请求匹配即可。

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

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

    (另外,看看当你写“new Func<.... func>

    希望我能有所帮助。

    【讨论】:

    • 当我查看 where 子句定义时,它要求 Function() 谓词。那么这意味着什么。是不是这个意思。谓词中的最后一个参数,即 表示委托的返回类型。我说的对吗
    • 所描述的命名函数 madgnome 也为您提供了一个很好的例子。 Func 只要求 的签名,而 Func 原生支持多达 16 个参数和结果类型。
    • 能否请您提供这16个参数列表。我正在寻找最后一个小时。我知道它支持 16 种类型但没有得到列表。很久以前我只看到过一次。是的,在您的编辑之后。我在任何地方都使用 Lambda,但唯一的区别是我知道如何实现它们,但对概念不清楚,这就是我试图理解它们的原因,这就是我发布这个问题的原因。
    • @Shantanu Gupta,我想我们在这里的意思完全一样。该列表是 Func 和 Func 等重载到 Func (因此这里的 Lambda 主体将完全满足这些要求。 (parameters) => { 具有所述返回类型的方法体。}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多