使用Delegates调用Lambda表达式的语法

时间:2014-08-21 14:13:55

标签: c# lambda delegates

我发现以下示例效果很好:

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;
}

更新:感谢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;
}

3 个答案:

答案 0 :(得分:3)

您可以尝试以下内容:

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

答案 1 :(得分:1)

Where<T>接受一个具有单个T输入和bool输出(也称为谓词)的委托。要使用具有两个参数的方法,您必须使用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));
}

答案 2 :(得分:1)

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,或者它特别复杂。