2009-10-12 36 views
31

我要实现在switch声明如下:评估在switch语句中的表达式C#

switch(num) 
{ 
    case 4: 
    // some code ; 
    break; 
    case 3: 
    // some code ; 
    break; 
    case 0: 
    // some code ; 
    break; 
    case < 0: 
    // some code ; 
    break; 
} 

是否有可能有switch语句评估case < 0?如果不是,我该怎么做?

+4

请不要将您的问题标记为“紧急”,即使它适合您:http://catb.org/~esr/faqs/smart-questions.html#urgent – 2009-10-12 13:52:01

回答

57

你不能 - 开关/情况只适用于单个值。如果你想指定条件,你需要一个“如果”:

if (num < 0) 
{ 
    ... 
} 
else 
{ 
    switch(num) 
    { 
     case 0: // Code 
     case 1: // Code 
     case 2: // Code 
     ... 
    } 
} 
+0

非常感谢您 – 2009-10-12 13:52:07

+22

甚至switch(num){case 0:case 1:default:if(num <0){..}} – falstro 2009-10-12 13:53:53

+2

@roe:是的,我也考虑过这种形式。尽管时间虽然:) – 2009-10-12 14:49:14

5

你将不得不使用if,无论你想不想。开关只能将您的值与常数值进行比较。

+1

不正确 - 您可以使用三元运算符将小于零的情况合并为单个值,并在开关。 – 2009-10-12 13:54:28

+0

这是真的。这只是语言的限制。你可以在VB.Net中做到这一点,以及其他的东西,如使用值范围。像C#一样,如果必须与文字值进行比较,但还有更多可用的比较操作。 – 2009-10-12 14:00:26

+0

真的是查尔斯?有趣。我不知道。 – 2009-10-12 14:01:57

7

如果NUM不能小于零:

public int GetSwitch(int num) { return num < 0 ? -1 : num; } 
switch(GetSwitch(num)) 
{ 
case 4: // some code ; break; 
case 3:// some code ; break; 
case 0: // some code ; break; 
case -1 :// some code ; break; 
} 

如果可以使用一些其他“不存在的”数字,如int.MinValue。

+0

这就是我正在建议的 - 但为什么把三元不同的功能呢? – 2009-10-12 13:53:40

+0

有趣的解决方案+1,尽管我个人觉得额外的函数调用会混淆视图,switch(num <0?-1:num)'只是感觉更明显。 – falstro 2009-10-12 13:57:03

+0

我是SRP和DRY的忠实追随者 - 所以即使在不知不觉中,我会将一种行为与另一种无关的行为分开。例如,GetSwitch()可以重复使用,如果您需要两个开关 - 您是否将三元组复制/粘贴到那里?我不认为复制/粘贴一个良好的做法。 – queen3 2009-10-12 13:59:49

5

我能想到的(我真的不推荐它)的唯一途径,是如下:

int someValue; 

switch (Math.Max(someValue, -1)) 
{ 
    case -1: 
     // will be executed for everything lower than zero. 
     break; 

    case 0: 
     // will be executed for value 0. 
     break; 

    case 1: 
     // will be executed for value 1. 
     break; 

    default: 
     // will be executed for anything else. 
     break; 
} 
+0

为什么我会陷入低谷? – 2009-10-12 13:53:50

+0

为什么不只是Math.Max(someValue,-1)?然后,他不需要担心+1偏移... – JustLoren 2009-10-12 13:54:23

+0

没有降低你的投票,但我认为这只是不好的风格。 – chakrit 2009-10-12 13:55:01

13

你可以在你的switch语句的结束做这样的事情:

default: 
    if(num < 0) 
    { 
     ... // Code 
    } 
    break; 
3

其他的方式将有可能还(与乔恩斯基特的答案):

switch(num) 
{ 
    case a: 
     break; 
    default: 
     if(num < 0) 
     {} 
    break; 
} 
1

你不能我们如果你在VB中可以比较交换机,你可以在这里选择2个选项,用你已知的值替换你打开的值并使用它或者 - 如果你的意思是所有其他情况 - 你可以使用默认子句:

switch(num) 
{ 
    case 4: 
    // some code ; 
    break; 
    case 3: 
    // some code ; 
    break; 
    case 0: 
    // some code ; 
    break; 
    default: 
    // some code ; 
    break; 
} 

请注意,这并不完全符合您的要求:除0,3,4以外的任何值都将以deafult:子句结束。