2010-08-05 87 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")); 

不对于很长的案例元素列表最值得赞赏的解决方案,但您试图执行内联开关语句;)

来自社区的批评?