2009-10-12 51 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:子句結束。