在λ表达式C#开关(C# switch in lambda expression)

2019-08-06 20:53发布

是否有可能公顷VE的lambda表达式的开关? 如果不是,为什么? ReSharper的显示为一个错误。

Answer 1:

你可以在一个语句块拉姆达:

Action<int> action = x =>
{
  switch(x)
  {
    case 0: Console.WriteLine("0"); break;
    default: Console.WriteLine("Not 0"); break;
  }
};

但你不能做一个“单式拉姆达”,因此这是无效的:

// This won't work
Expression<Func<int, int>> action = x =>
  switch(x)
  {
    case 0: return 0;
    default: return x + 1;
  };

这意味着不能在一个表达式树使用开关(由C#编译器至少为生成的;我相信.NET 4.0至少具有在库中对它的支持)。



Answer 2:

在纯粹的Expression (在.NET 3.5),就可以得到最接近的是有条件的化合物:

    Expression<Func<int, string>> func = x =>
        x == 1 ? "abc" : (
        x == 2 ? "def" : (
        x == 3 ? "ghi" :
                 "jkl")); /// yes, this is ugly as sin...

不好玩,尤其是当它变得复杂。 如果你的意思是与语句体(仅适用于LINQ到对象使用)一个LAMDA表达式,那么什么是括号内的法律:

    Func<int, string> func = x => {
        switch (x){
            case 1:  return "abc";
            case 2:  return "def";
            case 3:  return "ghi";
            default: return "jkl";
        }
    };

当然,你也许可以外包工作; 例如,LINQ到SQL允许你映射标量UDF(在数据库中)来对数据上下文的方法(即没有实际使用) - 例如:

var qry = from cust in ctx.Customers
          select new {cust.Name, CustomerType = ctx.MapType(cust.TypeFlag) };

其中, MapType就是做的工作在DB服务器UDF。



Answer 3:

是的,它的工作原理,但你必须把你的代码块。 例:

private bool DoSomething(Func<string, bool> callback)
{
    return callback("FOO");
}

然后,把它称为:

DoSomething(val =>
                {
                    switch (val)
                    {
                        case "Foo":
                            return true;

                        default:
                            return false;
                    }
                });


Answer 4:

嗯,我看不出有任何理由为什么这不应该工作。 只是要小心你使用的语法

param => {
    // Nearly any code!
}

delegate (param) {
    // Nearly any code!
}

param => JustASingleExpression (No switches)


Answer 5:

我检查过:-)

[Test]
public void SwitchInLambda()
{
    TakeALambda(i => {
        switch (i)
        {
            case 2:
                return "Smurf";
            default:
                return "Gnurf";
        }
    });
}

public void TakeALambda(Func<int, string> func)
{
    System.Diagnostics.Debug.WriteLine(func(2));
}

工作得很好(输出“蓝精灵”)!



Answer 6:

我刚学这个:

                      (model) =>
                                {
                                    switch(model.SentInvoiceTypeId)
                                    {
                                        case 1:
                                            return "1 asdf";
                                        case 2:
                                            return "2 asdf";
                                        case 3:
                                            return "3 asdf ";
                                        case 4:
                                            return "4 asdf ";
                                        default:
                                            return "asdf";
                                    }
                                }

只要把“模型”之间的(),并添加您的代码{},记得有一个回报。
我不知道其中的C#版本会的工作,在这个例子中是C#7.0

我希望这个回答能帮助别人。



文章来源: C# switch in lambda expression