将变量设置为开关的结果

时间:2011-11-16 17:13:40

标签: c# .net switch-statement

我是疯了还是有办法在C#中将变量设置为开关的结果?类似的东西:

 var a = switch(b)
    {
     case c:
     d;
     case e:
     f;
     default:
     g;
    };

是否可以使用任何其他语言?我只是认为它是,但我没有得到任何编译。提前谢谢。

9 个答案:

答案 0 :(得分:23)

不,switch是一个陈述而不是可以评估的表达。

当然,您可以将其提取到另一种方法中:

int x = DoSwitch(y);

...

private int DoSwitch(int y)
{
    switch (y)
    {
        case 0: return 10;
        case 1: return 20;
        default: return 5;
    }
}

或者,如果仅仅是简单的常量映射,则可以使用Dictionary。如果您可以向我们提供有关您要实现的目标的更多信息,我们可以帮助您找到最恰当的方式来实现目标。

答案 1 :(得分:12)

不,您不能将switch语句用作表达式。编写它的另一种方法是嵌套条件运算符:

var a = b == c ? d:
        b == e ? f:
                 g;

答案 2 :(得分:6)

这在C#中是不可能的。

最接近的是将其移动到方法中,或者在每种情况下单独进行分配,即:

int a;
switch(b)
{
 case c:
     a = d; break;
 case e:
     a = f; break;
 default:
     a = g; break;
};
  

是否可以使用任何其他语言?

是。例如,大多数函数式语言都支持类似的东西。例如,F#的pattern matching提供了一个(功能更强大)版本。

答案 3 :(得分:6)

如果你不是特别关心效率,那么使用泛型来烹饪一个小课程会很容易,这样可以让你使用一个“流畅的”方法调用链,例如:

var a=Switch(b).Case(c).Then(d).Case(e).Then(f).Default(g);

或者,如果您愿意,可以使用更紧凑的

var a=Switch(b).Case(c, d).Case(e, f).Default(g);

如果您对此感兴趣,我会很乐意做一个例子

答案 4 :(得分:3)

C#中的

switch是一个没有“返回”值的语句。如果你对使用“switch”表达感兴趣,你可以找到我写的here这个小流畅的类,以便得到这样的代码:

a = Switch.On(b)
  .Case(c).Then(d)
  .Case(e).Then(f)
  .Default(g);

您可以更进一步,使用Then方法的函数参数进一步概括。

答案 5 :(得分:2)

我只想补充一点,Jon Skeet 的答案不会编译并导致错误,因为 C#8 开关分配需要用分号关闭。

var a = b switch
{
    c => d,
    e => f,
    _ => g
}; //<-- here

/我没有资格在他的回答下对此发表评论,但由于他是最佳答案,因此应该注意。/

我现在编辑了有问题的答案

答案 6 :(得分:1)

没有

switch语句提供分支控制。它不是一个评估可以分配给变量的函数的函数。

答案 7 :(得分:1)

我想要同样的东西,因为我使用了很多Ruby,这可以让你做那样的事情。所以我创建了一个名为FluentSwitch的nuget包。

答案 8 :(得分:1)

您可以从c# 8.0开始使用它,它被称为“切换表达式”:

const int c = 1;
int d = 2;
const int e = 3;
int f = 4;
int g = 5;

int b = 3;

var a = b switch
{
    c => d,
    e => f,
    _ => g,
};

Console.WriteLine(a);

a将包含值4

ce根据开关语法应为常量,_对应于默认开关分支