2010-08-05 63 views
4

我在看奇怪的腳踢幾行代碼。有沒有辦法將它壓縮爲內聯的case語句?C#中的內聯開關/ case語句

switch (FIZZBUZZ) 
    { 
     case "Fizz": 
     { 
      //Do one process 
      break; 
     } 
     case "Buzz": 
     { 
      //Do one process 
      break; 
     } 
     case "FizzBuzz": 
     { 
      //Do one process 
      break; 
     } 
    } 

看起來是這樣的:

switch (FIZZBUZZ) 
    { 
     case "Fizz": //Do one process 
     case "Buzz": //Do one process 
     case "FizzBuzz": //Do one process 
    } 
+5

得到那踢,有些事情可以做得很好,但通常你會開始寫越來越少的可讀代碼。 – 2010-08-05 15:00:30

回答

13

如果要壓縮的東西,你可以只是把東西放在同一行(讓我們想象一下,「做一個過程是Console.WriteLine通話):

switch (FIZZBUZZ) 
{ 
    case "Fizz": Console.WriteLine("Fizz"); break; 
    case "Buzz": Console.WriteLine("Buzz"); break; 
    case "FizzBuzz": Console.WriteLine("FizzBuzz"); break; 
} 

如果你想獲得看上你可以創建地圖的字符串來操作是這樣的:

var map = new Dictionary<String, Action> 
{ 
    { "Fizz",() => Console.WriteLine("Fizz") }, 
    { "Buzz",() => Console.WriteLine("Fizz") }, 
    { "FizzBuzz",() => Console.WriteLine("FizzBuzz") } 
}; 

然後你可以調用這樣的方法:

map[FIZZBUZZ].Invoke(); // or this: map[FIZZBUZZ](); 
+0

嗯,但我有兩個調用「handleFizz」和「handleBuzz」。然後給他們打電話給他們。我會這樣重複代碼。儘管我喜歡濃縮,但我喜歡效率。 :) – Jim 2010-08-05 15:03:24

+0

@Jim - 我喜歡正確性,可讀性和可維護性。我感到高興的是,至少在我們的例子中,我們的興趣可能是一致的。 :-) – 2010-08-05 15:09:33

1

你總是必須有一個break語句才能離開以外,你可以做到這一點你提到

switch (FIZZBUZZ) 
    { 
     case "Fizz": /*Do one process*/break; 
     case "Buzz": /*Do one process*/break; 
     case "FizzBuzz": /*Do one process*/break; 
    } 
開關
+0

打敗我吧! :) – 2010-08-05 14:54:42

0

那麼一個簡單的方法是:

switch (FIZZBUZZ) 
{ 
    case "Fizz": Console.WriteLine("Fizz"); break; 
    case "Buzz": Console.WriteLine("Buzz"); break; 
    case "FizzBuzz": Console.WriteLine("FizzBuzz"); break; 
} 

這是隻有每一條線。但是,那麼有每行的多條語句...

0

如果你真的有興趣在最少行代碼你可以寫:

switch (FIZZBUZZ) { case "Fizz": /* Do one process */ break; case "Buzz": /* Do one process */ break; case "FizzBuzz": /* Do one process */ break; } 

我不會推薦它雖然。

雖然很難確切地說出你在問什麼,但是你是否試圖在兩個案件之間穿梭,或者只是取下大括號?

+2

我其實對一位曾經激怒過我的同事這樣做。在一行上寫下整個班級。 – 2010-08-05 14:55:29

+0

我正試圖移除大括號。 – Jim 2010-08-05 14:55:45

+0

@Jim:除了開關塊本身的大括號之外,您不需要*其他大括號,因此只需將其移除即可。儘管如果您在任何這些情況下創建變量,建議讓他們確保範圍安全。 – 2010-08-05 15:02:57

0

我不知道有什麼辦法做到這一點,同時維持一定的可讀性,比其他明顯:

switch (FIZZBUZZ) 
    { 
     case "Fizz": { //Do one process } break; 
     case "Buzz": { //Do one process } break; 
     case "FizzBuzz": { //Do one process } break; 
    } 
0

你可以把儘可能多的代碼在同一行,你用C#一樣。正如安德魯所說的那樣:

個人而言,我的偏好是留出空白區域,因爲它可以讓代碼更容易閱讀,但是我又是這裏唯一一位評論他的代碼的開發者,或者寫的方法和功能足夠小,能夠快速掃描代碼以查看正是它所做的。 :)

0

你不需要大括號的case語句,但是你需要每個case的break語句。否則,你真的不能做太多

6

的假設,這是純粹的深奧,你會不動心在生產系統中使用此,你可能濫用表達式樹:

FIZZBUZZ.Switch(Fizz => DoSomething(), 
       Buzz => DoSomethingElse(), 
       FizzBuzz => DoSomethingElseStill()); 

在哪裏Switch是一個擴展方法:

public static void Switch(this string @this, params Expression<Action>[] cases) 
{ 
    Expression<Action> matchingAction = cases.SingleOrDefault(@case => @case.Parameters[0].Name == @this); 
    if (matchingAction == null) return; // no matching action 

    matchingAction.Compile()(); 
} 
+1

我喜歡它!有趣的做事方式。 – 2012-08-07 15:42:59

9

僅供參考,如果有人一直在尋找一個在線速記開關case語句返回一個值,我發現對我來說最好的解決辦法是做一個嵌套循環,像這樣:

string Season = "Spring"; 
Season = Season == "Fall" ? "Spring" : Season == "Spring" ? "Summer" : "Fall"; 

您可以選擇使其更具可讀性,同時還內嵌在PARAMS包裹它:

var PeriodName = Season = (Season == "Fall" ? "Spring" : (Season == "Spring" ? "Summer" : "Fall")); 

所以,作爲一個執行代碼塊,你可以寫:

string FizzBuzz = "Fizz"; 
FizzBuzz = FizzBuzz == "Fizz" ? MethodThatReturnsAString("Fizz") : (FizzBuzz == "Buzz" ? MethodThatReturnsAString("Buzz") : MethodThatReturnsAString("FizzBuzz")); 

不對於很長的案例元素列表最值得讚賞的解決方案,但您試圖執行內聯開關語句;)

來自社區的批評?