你能在单个语句中定义和执行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
您可以使用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)
,我无法让它工作,但不认为这一定是一件坏事。
由于各种原因,它将无法编译:
-
不能重复使用
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;
};
所以你的问题的答案是"是",但你最好不要这样做。