簡體   English   中英

案例/轉換語句c#?

[英]Case/switch statements c#?

我沒有生活線索如何在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!");
            }

這可能嗎?

謝謝。

要在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");
}

C#沒有特別靈活的switch語句。 這是有意的,選項僅限於確保代碼生成快速 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次比較。 如果速度是必要的並且范圍有限,那么考慮切換到查找表,字典<>。 這里沒有必要,ShowMessage()是一種昂貴的方法。

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
 }

如果它應該是一個開關,那么它應該是這樣的:

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.

你可以使用這個答案。

您可以通過創建一個非常長的case語句或將一系列數字轉換為常量的擴展方法來使用switch / case語句。 但是使用if / else塊可能更容易。

就個人而言,我喜歡Enumerable.Range的可讀性略高於> =和<=。 但是,這是一個較慢的操作,因為每次進行比較時都會創建一個可枚舉的整數。 當你進入成千上萬的畢業生時,你可能會注意到性能問題。

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

解決問題的解決方案就是這樣做。

switch (Total)
{
case 1: case 2: case 3:          
    // Do Something
    break;
case 4: case 5: case 6: 
    // Do Something
    break;
default:
    // Do Something
    break;
}

交換機中的多個案例:

那這個呢?:

var s = "EEEEDCBBAAA";
var result = s[Total/10];
MessageBox.Show("you got a " + result);

因為Switch Statements Smells :)

更新

沒有意識到a / a 區別,但是:

MessageBox.Show(string.Format("you got a{0} {1}", 
     result == "A" || result == "E" ? "n" : "", 
     result));

使用動作查找(如命令模式)

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();
        }

這段代碼怎么樣:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM