可以在c#中组合两个动作吗?

erm*_*erd 4 c# lambda

我只是在玩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,但如果在新版本中进行了简化,请告诉我.

Mat*_*son 8

可以使用+=运算符来连接委托,您可以使用它来简化您的特定示例.

例如,您可以像这样简化代码:

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)

话虽如此,我认为你不应该这样做 - 这太微妙了.您的原始代码没有任何问题!


Gil*_*een 5

完全相同,但可能会更优雅(这是问题的关键):使用条件运算符(?:)

Action<MyType> myLambda = myBooleanCondition ? x => x.ChangeBehavior() :
                                               x => x.ChangeBehavior().ChangeSize();
Run Code Online (Sandbox Code Playgroud)

  • @PatrickHofman - 是的......它没有真正的区别.但他要求更优雅的方式......可能是这个...... (3认同)
  • @PatrickHofman,"实际上相同"正是OP正在寻找的东西.问题是关于优雅而不是有效性. (2认同)