我是疯了还是有办法在C#中将变量设置为开关的结果?类似的东西:
var a = switch(b)
{
case c:
d;
case e:
f;
default:
g;
};
是否可以使用任何其他语言?我只是认为它是,但我没有得到任何编译。提前谢谢。
答案 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)
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
c
和e
根据开关语法应为常量,_
对应于默认开关分支