我没有生动线索如何在c#中写这个。我知道如何在Delphi中做到这一点。
这就是我在Delphi中的表现:
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#中的版本:
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!");
}
这可能吗?
感谢。
答案 0 :(得分:9)
要在C#中的switch / case
语句中表示范围,您必须手动列出案例
switch (Total) {
case 80:
case 81:
...
case 100:
MessageBox.Show("you got an A");
break;
...
}
对于这样的大范围,尽管使用一系列if
语句可能更好
if (Total >= 80 && Total <= 100) {
MessageBox.Show("you got an A");
} else if (Total >= 70) {
MessageBox.Show("you got a B");
}
答案 1 :(得分:8)
C#没有特别灵活的开关语句。这是有意的,选项仅限于确保代码生成快速。 C#从来就不是一种隐藏执行成本的语言。运行时实现是通过跳转表,由switch()表达式索引。非常快,但不是很灵活。
替代方案是明确的if / else if链。与VB.NET或Delphi编译器生成的完全相同的代码,但是手工编写。不是很漂亮,但足够有效:
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...');
现在还显示了与代码相关的成本,Total值最多可以进行6次比较。如果速度是必要的并且范围有限,则考虑切换到查找表,字典&lt;&gt;。这里没有必要,ShowMessage()是一种昂贵的方法。
答案 2 :(得分:3)
AFAIK你不能在C#本地使用它,但是如果你想用一个开关来做,就像你在问题中所说的那样,有一个解决方法(对于固定范围)。 考虑你的间隔为20乘20:
int interval= (value-1) / 20;
switch (interval)
{
case 0: // 1-20
//Do stuffs
break;
case 1: // 21-40
//Do stuffs
break;
// and so on
}
答案 3 :(得分:3)
如果它应该是一个开关,那么它应该是这样的:
switch(Total)
{
case 100:
case 99:
//...
case 80:
MessageBox.Show("You got an A!");
break;
case 79:
// ...
}
如果可以使用if语句,我建议这样做:
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.
跳,你可以使用这个答案。
答案 4 :(得分:2)
您可以通过创建一个非常长的case语句或将一系列数字转换为常量的扩展方法来使用switch / case语句。但是使用if / else块可能更容易。
就个人而言,我喜欢Enumerable.Range
略高于&gt; =和&lt; =的可读性。但是,这是一个较慢的操作,因为您每次进行比较时都会创建一个可枚举的整数。当你进入成千上万的毕业生时,你可能会注意到性能问题。
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...");
}
答案 5 :(得分:2)
解决问题的方法是这样做。
switch (Total)
{
case 1: case 2: case 3:
// Do Something
break;
case 4: case 5: case 6:
// Do Something
break;
default:
// Do Something
break;
}
答案 6 :(得分:2)
这个怎么样?:
var s = "EEEEDCBBAAA";
var result = s[Total/10];
MessageBox.Show("you got a " + result);
没有意识到 a / 的区别,但是:
MessageBox.Show(string.Format("you got a{0} {1}",
result == "A" || result == "E" ? "n" : "",
result));
答案 7 :(得分:2)
使用操作查找(如命令模式)
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来减少检查,但这只适用于某些大学规模:
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();
}
答案 8 :(得分:1)
这段代码怎么样:
private string GetTotalCode(int total) {
if (Total >= 80 && Total <= 100)
return "A"
if ...
}
然后简化开关:
switch (GetTotalCode(Total)) {
case "A":
MessageBox.Show("you got an A");
break;
...
}