是否可以在一行代码中定义和执行Lambda,将lambda的结果返回给变量?
我希望实现类似的东西(显然我正在简化)
int x = 1;
int y = 3;
int z = (x, y) => {
int z = 5;
return x + y + z;
}
在这种情况下,z将初始化为9.
答案 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)
正如您的代码所代表的那样,它不会因各种原因而编译:
您无法以这种方式重复使用x
和y
。
您不能以这种方式声明匿名函数。必须在使用前将其声明为委托。
所以你最终得到的代码如下:
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;,但最好不要这样做。