【问题标题】:Lambda expression to Func<T, TResult> [closed]Lambda 表达式到 Func<T, TResult> [关闭]
【发布时间】:2015-12-31 20:16:19
【问题描述】:

如何将optionObject.Forms.First(f =&gt; f.FormId == formId).MultipleIteration 中的 lambda 表达式写入 Func,所以最后我有类似的东西

Func<FormObject, bool> FormID = f => f.formID == passedVal;

然后在第一个表达式上使用它来得到类似的东西

optionObject.Forms.First(FormID).MultipleIteration

我试过了

Func<FormObject, PassedVal, bool> FormID => formID == PassedVal;

但是没有用。
请注意 lambda 表达式没有任何问题,它可以正常工作。我只是想创建一个函数,将表达式替换为函数的名称,以使代码看起来更短且可维护。

【问题讨论】:

  • 没有关注,你能更详细地解释你的问题吗?
  • Reuse of a LINQ query的可能重复
  • 是的,这就像上面的 LINQ 链接的重用,只是在这种情况下要比较的值不是硬编码的,而是传递给使用表达式的方法的参数跨度>
  • 您的Func&lt;FormObject, PassedVal, bool&gt; 不起作用的原因是First 和类似方法采用的lambda 签名需要Func&lt;FormObject, bool&gt;。由于您还想参数化另一个值,因此 31eee384 的答案看起来是最好的,也可能是唯一的方法。

标签: c# .net lambda func


【解决方案1】:

让您重用具有新传递值的函数体的一个选项是在类级函数中生成Func&lt;FormData, bool&gt; 实例:

public static Func<FormObject, bool> CreateFormValidFunc(int validId)
{
    return f => f.formID == validId;
}

那么你可以这样使用它:

optionObject.Forms.First(CreateFormValidFunc(passedVal)).MultipleIteration
optionObject.Forms.First(CreateFormValidFunc(2)).MultipleIteration

一个有趣的旁注是 int Foo =&gt; 0; 是“表达式主体属性”语法 (new to C# 6.0),您的尝试可能已经匹配到足以使错误消息令人困惑。

您可以使用表达式主体方法将验证函数生成器简化为:

public static Func<FormObject, bool> CreateFormValidFunc(int validId) => f => f.formID == validId;

【讨论】:

  • 这个解决方案效果很好。谢谢大家。
【解决方案2】:

这篇文章可以帮助你: lambda expression and var keyword

当我尝试使用 var add = (x, y) =&gt; x + y; 时,编译器需要能够将集合减少为 x 的一种类型和 y 的一种类型(不完全正确,可能基类和派生类都适合) 并且即使编译器可以找出 x 和 y 的类型,或者您指定了类型让我们说 int,您仍然会留下这样一个事实,即 Expression> 和 Func 都是可能的 add 类型。

在你的场景中你可以使用这个:

Expression<Func<FormObject, bool>> FormID = f => f.formID == passedVal;

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多