案例/转换语句c#?

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中的switch / case语句中表示一个范围,您必须手动列出案例

1
2
3
4
5
6
7
8
9
switch (Total) {
  case 80:
  case 81:
  ...
  case 100:
    MessageBox.Show("you got an A");
    break;
  ...
}

对于这样的大范围,最好使用一系列if语句

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块可能更容易。

就我个人而言,我喜欢Enumerable.Range的可读性略高于>=和<=。但是,这是一个较慢的操作,因为每次进行比较时都会创建一个可枚举的整数。不过,当你进入数万名毕业生时,你可能会注意到绩效问题。

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;
  ...
}