你能在单个语句中定义和执行Lambda方法吗?

本文关键字:Lambda 执行 方法 定义 单个 语句 | 更新日期: 2023-09-27 17:50:56

是否可以在一行代码中定义和执行Lambda,并将Lambda的结果返回给变量?

我想实现(显然我在简化)

int x = 1;
int y = 3; 
int z = (x, y) => { 
    int z = 5;
    return x + y + z;
}

在本例中,z初始化为9

你能在单个语句中定义和执行Lambda方法吗?

您可以使用Func来定义一个可调用的函数,那么如果您只在一个地方使用它:

int x = 1;
int y = 3;
int z = (new Func<int, int, int>((a, b) =>
 {
     int c = 5;
     return a + b + c;
 }))(x, y);

如果我正确理解了这个问题,您可以在使用in之前尝试使用lambda而不将lambda表达式分配给变量。这是完全可能的,尽管你需要相应的委托声明和强制类型转换来实现它。

下面的代码显示了如何通过5个步骤到达那里,最后一个步骤可能显示了您试图实现的目标。

namespace ConsoleApplication1
{
    delegate int F(int x, int y, int z);
    delegate int Fz(int x, int y);
    delegate Fz Cz(F formula, int z);
    class Program
    {
        static Fz Curry(F f, int z)
        {
            return (x, y) => { return f(x,y,z); };
        }
        static void Main(string[] args)
        {
            {   // Verbose version
                F f = (x, y, z) => { return x + y + z; };
                Fz z5 = Curry(f, 5);
                int result = z5(1, 3);
                System.Console.WriteLine("1 + 3 + 5 = {0}", result);
            }
            {   // Inline version 1
                Fz z5 = Curry((x, y, z) => { return x + y + z; }, 5);
                int result = z5(1, 3);
                System.Console.WriteLine("1 + 3 + 5 = {0}", result);
            }
            {   // Inline version 2
                int result = Curry((x, y, z) => { return x + y + z; }, 5)(1, 3);
                System.Console.WriteLine("1 + 3 + 5 = {0}", result);
            }
            {   // Inline version 3
                Cz zn = (f, z) => { return (x, y) => { return f(x, y, z); }; };
                int result = zn((x, y, z) => { return x + y + z; }, 5)(1, 3);
                System.Console.WriteLine("1 + 3 + 5 = {0}", result);
            }
            {   // Inline version 4 (max obfuscation)
                int result = ((Cz)((f, z) => { return (x, y) => { return f(x, y, z); }; }))((x, y, z) => { return x + y + z; }, 5)(1, 3);
                System.Console.WriteLine("1 + 3 + 5 = {0}", result);
            }
        }
    }
}

正如另一个答案所指出的,你也可以使用Func<>来完成工作。我的解决方案表明,在c#中使用lambdas可以"接近功能"。只差一点,因为需要定义各自的委托,并且限制了与函数式语言(如f#)相比可以完成的泛型性质。

对于问题中显示的问题,Func<>可能是更简洁的方法,但我的代码优点是概述,既不需要Func<>也不需要lambda的赋值。如果没有cast (Cz),我无法让它工作,但不认为这一定是一件坏事。

由于各种原因,它将无法编译:

  1. 不能重复使用xy

  2. 不能用这种方式声明匿名函数。它必须在使用前声明为委托。

所以你会得到这样的代码:

int x = 1;
int y = 3;
Func<int, int, int> calc = (x1, y1) =>
{
    int z1 = 5;
    return x1 + y1 + z1;
};
var z = calc(x, y);

与使用命名函数相比,这会创建难以阅读的代码:

...
{
    int x = 1;
    int y = 3;
    int z = F(x, y);
}
private static int F(int x, int y)
{
    int z = 5;
    return x + y + z;
};

所以你的问题的答案是"是",但你最好不要这样做。