Case/switch statements c#?
我不知道怎么用C语言写这个。我知道怎么用德尔福。
这就是我在德尔福的方法:
1 2 3 4 5 6 7 | Case Total of 80..100 : ShowMessage ('You got an A!'); 60..79 : ShowMessage ('You got a B!'); 50..59 : ShowMessage ('You got a C!'); 40..49 : ShowMessage ('You got a D!'); 0..39 : ShowMessage ('You got an E...'); end; |
我已经阅读了相关的教程,但我不知道如何按照我需要的方式使用/编写它。
这是我在C中的版本:
1 2 3 4 5 6 7 8 9 10 | switch (Total) //'Total' is a bunch of Integers divided together to get a Percentage { case 80..100: //Where 80% to 100% would achieve an A { MessageBox.Show("You got an A!"); } case 60..79: //Where 60% to 79% would achieve a B { MessageBox.Show("You got a B!"); } |
这有可能吗?
谢谢。
要在c中的
1 2 3 4 5 6 7 8 9 | switch (Total) { case 80: case 81: ... case 100: MessageBox.Show("you got an A"); break; ... } |
对于这样的大范围,最好使用一系列
1 2 3 4 5 | if (Total >= 80 && Total <= 100) { MessageBox.Show("you got an A"); } else if (Total >= 70) { MessageBox.Show("you got a B"); } |
C没有特别灵活的switch语句。这是有意的,选项是有限的,以确保代码生成速度很快。C从来不是一种隐藏执行成本的语言。运行时实现是通过一个跳转表实现的,由switch()表达式索引。速度很快,但不是很灵活。
另一种方法是显式if/else if链。与vb.net或delphi编译器生成的代码完全相同,但是手工编写的。不是非常漂亮,但足够有效:
1 2 3 4 5 6 | if (Total < 0 || Total > 100) throw new ArgumentException("Not a valid grade"); if (Total >= 80) ShowMessage ('You got an A!'); else if (Total >= 60) ShowMessage ('You got a B!'); else if (Total >= 50) ShowMessage ('You got a C!'); else if (Total >= 40) ShowMessage ('You got a D!'); else ShowMessage ('You got an E...'); |
这也显示了与代码相关的成本,总价值最多可以有6个比较。如果速度是必要的,范围是有限的,那么考虑切换到查找表,字典<>。这里不需要,showMessage()是一个昂贵的方法。
如果它应该是一个开关,那么它应该是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 | switch(Total) { case 100: case 99: //... case 80: MessageBox.Show("You got an A!"); break; case 79: // ... } |
如果可以使用if语句,我建议这样做:
1 2 3 4 5 6 7 8 9 | if (Total < 0) { } else if (Total < 40) MessageBox.Show("You got an E...") else if (Total < 50) MessageBox.Show("You got a D!"); else if (Total < 60) // etc. |
你可以用这个答案。
如果你想用一个开关来做,就像你在问题中所说的那样,那么你就有一个解决办法(对于固定范围)。考虑到你20比20的时间间隔:
1 2 3 4 5 6 7 8 9 10 11 | int interval= (value-1) / 20; switch (interval) { case 0: // 1-20 //Do stuffs break; case 1: // 21-40 //Do stuffs break; // and so on } |
使用操作查找(如命令模式)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | static void Main(string[] args) { var theGrade = 89; var gradeLookup = new Dictionary<Func<int, bool>, Action> { { x => x >= 90, () => ShowMessage("You got an A!") }, { x => x >= 80 && x < 90, () => ShowMessage("You got an B!") }, }; gradeLookup.First(x => x.Key(theGrade)).Value(); Console.ReadKey(); } static void ShowMessage(string msg) { Console.WriteLine(msg); } |
你也可以简单地除以10来减少检查,但这只适用于一些大学规模:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | static void Main(string[] args) { var theGrade = 80; switch (theGrade / 10) { case 10: case 9: ShowMessage("You got an A"); break; case 8: ShowMessage("You got a B"); break; case 7: ShowMessage("You got a C"); break; case 6: ShowMessage("You got a D"); break; default: ShowMessage("You got a F"); break; } Console.ReadKey(); } |
这个怎么样?:
1 2 3 | var s ="EEEEDCBBAAA"; var result = s[Total/10]; MessageBox.Show("you got a" + result); |
因为switch语句闻起来:)
更新没有意识到A/A的区别,但是:
1 2 3 | MessageBox.Show(string.Format("you got a{0} {1}", result =="A" || result =="E" ?"n" :"", result)); |
解决问题的方法是这样做。
1 2 3 4 5 6 7 8 9 10 11 12 | switch (Total) { case 1: case 2: case 3: // Do Something break; case 4: case 5: case 6: // Do Something break; default: // Do Something break; } |
开关中有多个案例:
您可以通过创建一个非常长的case语句或一个扩展方法来使用switch/case语句,该方法将一系列数字转换为常量。但使用if/else块可能更容易。
就我个人而言,我喜欢
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | if(Enumerable.Range(80,100).Contains(Total)) { MessageBox.Show("You got an A!"); } else if(Enumerable.Range(60, 79).Contains(Total)) { MessageBox.Show("You got a B!"); } else if(Enumerable.Range(50, 59).Contains(Total)) { MessageBox.Show("You got a C!"); } else if(Enumerable.Range(40, 49).Contains(Total)) { MessageBox.Show("You got a D!"); } else if(Enumerable.Range(0, 39).Contains(Total)) { MessageBox.Show("You got an E..."); } |
这个代码怎么办:
1 2 3 4 5 | private string GetTotalCode(int total) { if (Total >= 80 && Total <= 100) return"A" if ... } |
然后简化切换:
1 2 3 4 5 6 | switch (GetTotalCode(Total)) { case"A": MessageBox.Show("you got an A"); break; ... } |