使用委托调用Lambda表达式的语法

本文关键字:表达式 语法 Lambda 调用 | 更新日期: 2023-09-27 18:18:56

我发现下面的例子效果很好:

private static bool GreaterTwo(int arg)
{
    return arg > 2;
}
public static void GreaterTwoSample()
{
    Enumerable.Range(0, 10).Where(GreaterTwo);
}

在WHERE-Lambda:

中使用GreaterTwo和另一个参数的语法是什么?
private static bool GreaterTwoSmallerArg2(int arg, int arg2)
{
    return arg > 2 && arg < arg2;
}

UPDATE:感谢HugoRune的回答,这里是另一个带有2个参数的工作示例

public static void LimitationSample()
{
    Enumerable.Range(0, 10).Where(IsBetween(2, 5));
}
private static Func<int, bool> IsBetween(int min, int max)
{
    return x  => x > min && x < max;
}

使用委托调用Lambda表达式的语法

您可以尝试如下操作:

public static void GreaterTwoSample(int arg2)
{
    Enumerable.Range(0, 10).Where(x=>GreaterTwoSmallerArg2(x, arg2));
}

Enumerable.Range(0, 10).Where(...)要求函数接受单个int作为参数并返回bool,这是没有办法的

两种常用的方法是:

  • 传递现有函数的名称,该函数接受int,即

    Enumerable.Range(0, 10).Where(YourFunctionThatTakesAnIntAndReturnsBool);
    
  • 传递lambda表达式

    Enumerable.Range(0, 10).Where(x=>{Expression_that_returns_a_bool})
    
所以如果你想使用一个需要两个整数的函数,基本的解决方案是将其打包到一个lambda表达式中,即
Enumerable.Range(0, 10).Where(x=>GreaterTwoSmallerArg2(x, 5))

但是如果你想要更多的语法糖,你可以创建一个函数来返回一个函数

private static Func<int,bool> funcGreaterTwoSmallerArg2(int arg2)
{
    return x => GreaterTwoSmallerArg2(x, arg2);
    // OR: return x => x > 2 && x < arg2;
}

那么你可以这样使用:

Enumerable.Range(0, 10).Where(funcGreaterTwoSmallerArg2(5));

这种语法应该小心使用,它会使源代码难以理解。但是,如果您经常重用某个特定的lambda,或者它特别复杂,那么有时这样做是必要的。

Where<T>接受一个具有单个T输入和bool输出(aka谓词)的委托。要使用具有两个参数的方法,您必须使用lambda对其进行投影:

private static bool GreaterTwoSmallerArg2(int arg, int arg2)
{
    return arg > 2 && arg < arg2;
}
public static void GreaterTwoSample()
{
    Enumerable.Range(0, 10).Where(i => GreaterTwoSmallerArg2(i, {some other value));
}