759 Stimmen

Mehrere Fälle in switch-Anweisung

Gibt es eine Möglichkeit, durch mehrere Case-Anweisungen zu fallen, ohne case value: wiederholt?

Ich weiß, dass das funktioniert:

switch (value)
{
   case 1:
   case 2:
   case 3:
      // Do some stuff
      break;
   case 4:
   case 5:
   case 6:
      // Do some different stuff
      break;
   default:
       // Default stuff
      break;
}

aber ich würde gerne etwas in dieser Art machen:

switch (value)
{
   case 1,2,3:
      // Do something
      break;
   case 4,5,6:
      // Do something
      break;
   default:
      // Do the Default
      break;
}

Ist diese Syntax, an die ich denke, aus einer anderen Sprache, oder übersehe ich etwas?

1 Stimmen

Gibt es einen Grund, warum Sie nicht einfach eine IF-Anweisung verwenden (wenn Sie einen Bereich von Ints überprüfen)?

2 Stimmen

Ja charlse, die erste Methode funktioniert gut, ich habe sie an vielen Stellen verwendet. Es ist schmutziger als mir lieb ist, aber es ist nützlich. Ich habe diese ganzen Zahlen nur als Beispiel verwendet. Die echten Daten waren vielfältiger. Ein if (1 || 2 || 3 ) {...} else if (4 || 5 || 6) {...} hätte auch funktioniert, aber es ist schwieriger zu lesen.

6 Stimmen

Warum halten Sie letztere für schmutziger als erstere? Letzteres verleiht dem Begriff "Schmutz" eine weitere Bedeutung , und eine, die mit keiner anderen Sprache im C-Stil geteilt wird. Das scheint mir viel schmutziger zu sein.

881voto

Carlos Quintanilla Punkte 12057

Ich denke, diese Frage wurde bereits beantwortet. Ich denke jedoch, dass Sie immer noch beide Optionen auf syntaktisch bessere Weise mischen können, indem Sie dies tun:

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

4 Stimmen

Der kollabierte Code wird auf das erste Beispiel in der Frage ausgedehnt. Sie können es auch einfach so machen, wie es in der Frage steht.

14 Stimmen

Wozu die Mühe? Die automatische Einrückung in Visual Studio 2013 wird dies ohnehin in das Format der ursprünglichen Frage umwandeln.

5 Stimmen

@JeremyChild Vielleicht weil diese Antwort nur eine getarnte Kopie der Frage ist. Einer der seltenen Momente, in denen ich eine Antwort herunterstimme. Mal im Ernst, wie konnte das so viel Unterstützung bekommen?

371voto

Brian R. Bondy Punkte 325712

Für die zweite von Ihnen erwähnte Methode gibt es weder in C++ noch in C# eine Syntax.

An Ihrer ersten Methode ist nichts auszusetzen. Wenn Sie jedoch sehr große Bereiche haben, verwenden Sie einfach eine Reihe von if-Anweisungen.

5 Stimmen

Als Ergänzung möchte ich einen Link zur C# Sprachspezifikation hinzufügen, die auf MSDN unter msdn.microsoft.com/de-us/vcsharp/aa336809.aspx

1 Stimmen

Der Benutzer könnte einige if's (oder eine Tabellensuche) verwenden, um die Eingabe auf einen Satz von Enums zu reduzieren und das Enum einzuschalten.

4 Stimmen

Ich glaube, das ist nicht mehr richtig. Siehe stackoverflow.com/questions/20147879/ . Auch auf diese Frage gibt es eine Antwort stackoverflow.com/a/44848705/1073157

154voto

Steve Gomez Punkte 8471

Originalantwort für C# 7

En C# 7 (standardmäßig verfügbar in Visual Studio 2017/.NET Framework 4.6.2), ist das bereichsbasierte Umschalten nun mit der Option Switch-Anweisung und würde bei dem Problem des Auftraggebers helfen.

Exemple :

int i = 5;

switch (i)
{
    case int n when (n >= 7):
        Console.WriteLine($"I am 7 or above: {n}");
        break;

    case int n when (n >= 4 && n <= 6 ):
        Console.WriteLine($"I am between 4 and 6: {n}");
        break;

    case int n when (n <= 3):
        Console.WriteLine($"I am 3 or less: {n}");
        break;
}

// Output: I am between 4 and 6: 5

Anmerkungen:

  • Die Klammern ( y ) sind nicht erforderlich in der when Bedingung, werden aber in diesem Beispiel verwendet, um den/die Vergleiche hervorzuheben.
  • var kann auch verwendet werden anstelle von int . Zum Beispiel: case var n when n >= 7: .

Aktualisierte Beispiele für C# 9

switch(myValue)
{
    case <= 0:
        Console.WriteLine("Less than or equal to 0");
        break;
    case > 0 and <= 10:
        Console.WriteLine("More than 0 but less than or equal to 10");
        break;
    default:
        Console.WriteLine("More than 10");
        break;
}

または

var message = myValue switch
{
    <= 0 => "Less than or equal to 0",
    > 0 and <= 10 => "More than 0 but less than or equal to 10",
    _ => "More than 10"
};
Console.WriteLine(message);

4 Stimmen

Dies (Mustervergleich) sollte im Allgemeinen die beste Praxis sein, wenn Sie C# 7.x oder höher verwenden können, da es viel klarer ist als die anderen Antworten.

0 Stimmen

Gibt es eine Möglichkeit, dies mit einer Liste von Enums zu erreichen? Wo werden die Enums auf int abgebildet?

74voto

Neal Punkte 815

Diese Syntax stammt aus dem Visual Basic Select...Case-Anweisung :

Dim number As Integer = 8
Select Case number
    Case 1 To 5
        Debug.WriteLine("Between 1 and 5, inclusive")
        ' The following is the only Case clause that evaluates to True.
    Case 6, 7, 8
        Debug.WriteLine("Between 6 and 8, inclusive")
    Case Is < 1
        Debug.WriteLine("Equal to 9 or 10")
    Case Else
        Debug.WriteLine("Not between 1 and 10, inclusive")
End Select

Sie können diese Syntax nicht in C# verwenden. Stattdessen müssen Sie die Syntax aus Ihrem ersten Beispiel verwenden.

15 Stimmen

Wie kann das eine Antwort sein? "Sie können den folgenden Code nicht verwenden"

64voto

Esset Punkte 398

Mit C#9 kam das Relational Pattern Matching. Dies ermöglicht es uns zu tun:

switch (value)
{
    case 1 or 2 or 3:
      // Do stuff
      break;
    case 4 or 5 or 6:
      // Do stuff
      break;
    default:
        // Do stuff
        break;
}

Vertiefendes Tutorial zu Relational Patter in C#9

Änderungen bei der Mustererkennung für C# 9.0

Relationale Muster erlauben es dem Programmierer, auszudrücken, dass eine Eingabe Wert eine relationale Bedingung erfüllen muss, wenn er mit einem konstanten Wert

1 Stimmen

Aha! Die richtige, aktuelle Antwort. Jetzt müssen wir nur noch ein paar Jahre/Jahrzehnte warten, bis sie sich langsam durchsetzt...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X