2011-11-16 62 views
13

我疯了,还是有一种方法,在C#中,将变量设置为开关的结果?例如:将一个变量设置为开关的结果

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

是否有可能使用任何其他语言?我只是认为这是,但我没有得到任何东西来编译。提前致谢。

+3

'switch(b){case c:a = d;情况e:a = f;默认:a = g;}' –

+0

F#有这样的 – BLUEPIXY

回答

20

不,switch是一个声明,而不是一个可以评估的表达式。

当然,你可以提取它变成另一种方法:

int x = DoSwitch(y); 

... 

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

或者,你可以使用一个Dictionary如果它只是简单的,不变的映射关系的情况。如果您可以向我们提供更多关于您想要达到的目标的信息,我们可以帮助您制定出最实用的方式。

+0

不,我当然可以通过一百万种方式来解决它,我只是在每个陈述中都有a =无论如何,并且我认为我已经看到了这种情况。可能不会。好吧。没什么大不了。 – vbullinger

+0

“字典”正是我所需要的,谢谢! –

12

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

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

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

6

这在C#中是不可能的。

最接近的将是要么移动到这一点的方法,或做在每种情况下单独分配,即:

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

是否有可能在任何其他的语言吗?

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

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); 

如果您对此有兴趣,我很乐意编造一个例子

+1

哇,这正是我所做的[这里](http://stackoverflow.com/questions/3334138/combine-return-and-switch/3334876#3334876) –

+2

哦,这是甜的! –

+0

...虽然我认为你的实现可以被简化......你可以用不可变的数据结构来实现它,并且不需要维护字典。如果您不介意,我可能会对其他线索发表评论:-) –

3

switch在C#是一个语句没有“回报”价值。如果你有兴趣在具有“开关”的表情,你可以找到我为了写here小流利类有这样的代码:

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

你可以走一步和推广这种更其功能参数为Then方法。

1

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

+0

太棒了,谢谢! – vbullinger

相关问题