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

时间:2015-05-28 10:55:04

标签: c#

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

我希望实现类似的东西(显然我正在简化)

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

在这种情况下,z将初始化为9.

3 个答案:

答案 0 :(得分:5)

您可以使用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);

答案 1 :(得分:1)

如果我正确理解了这个问题,你会尝试使用lambdas,而不会在使用之前将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可以是“近乎功能性的”#34;只是差不多,因为需要定义相应的代表,并且限制了与函数语言(如F#)相比可以完成的通用性。

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

答案 2 :(得分:0)

正如您的代码所代表的那样,它不会因各种原因而编译:

  1. 您无法以这种方式重复使用xy

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

  3. 所以你最终得到的代码如下:

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

    所以问题的答案是&#34;是&#34;,但最好不要这样做。