我只是在玩Actions来提取lambda表达式.
我有一个布尔变量,并根据它的值,我的lambda体应该是不同的.
但是,在这种特殊情况下,差异只是调用另一种不改变返回类型的方法.这就是我所拥有的:
Action<MyType> myLambda;
if (myBooleanCondition)
{
myLambda = x => x.ChangeBehavior();
}
else
{
myLambda = x => x.ChangeBehavior().ChangeSize();
}
Run Code Online (Sandbox Code Playgroud)
是否可以将两个lambda定义减少/合并为一个以使其更优雅?
这个项目使用C#4.0,但如果在新版本中进行了简化,请告诉我.
可以使用+=运算符来连接委托,您可以使用它来简化您的特定示例.
例如,您可以像这样简化代码:
Action<MyType> myLambda = x => x.ChangeBehavior();
if (!myBooleanCondition)
myLambda += x => x.ChangeSize();
Run Code Online (Sandbox Code Playgroud)
完整的可编辑示例:
using System;
namespace Demo
{
class MyType
{
public MyType ChangeBehavior()
{
Console.WriteLine("ChangeBehavior()");
return this;
}
public void ChangeSize()
{
Console.WriteLine("ChangeSize()");
}
}
class Program
{
static void Main()
{
var x = new MyType();
test(true)(x); // Calls ChangeBehavior()
Console.WriteLine();
test(false)(x); // Calls ChangeBehavior() and then ChangeSize()
}
static Action<MyType> test(bool myBooleanCondition)
{
Action<MyType> myLambda = x => x.ChangeBehavior();
if (!myBooleanCondition)
myLambda += x => x.ChangeSize();
return myLambda;
}
}
}
Run Code Online (Sandbox Code Playgroud)
话虽如此,我认为你不应该这样做 - 这太微妙了.您的原始代码没有任何问题!
完全相同,但可能会更优雅(这是问题的关键):使用条件运算符(?:)
Action<MyType> myLambda = myBooleanCondition ? x => x.ChangeBehavior() :
x => x.ChangeBehavior().ChangeSize();
Run Code Online (Sandbox Code Playgroud)