2010-03-31 7 views
15

Est-ce que quelqu'un sait s'il est possible d'inclure une plage dans une instruction switch (et si oui, comment)?Instruction du commutateur en C#

Par exemple:

switch (x) 
{ 
    case 1: 
    //do something 
    break; 
    case 2..8: 
    //do something else 
    break; 
    default: 
    break; 
} 

Le compilateur ne semble pas aimer ce genre de syntaxe - ni n'aime:

case <= 8: 

Répondre

23

Non, ce n'est pas possible. Il y a quelques façons que je l'ai fait dans le passé:

codage fixe:

switch (x) 
{ 
    case 1: 
    //do something 
    break; 
    case 2: 
    case 3: 
    case 4: 
    case 5: 
    case 6: 
    case 7: 
    case 8: 
    //do something else 
    break; 
    default: 
    break; 
} 

En combinaison avec une déclaration if {}:

switch (x) 
{ 
    case 1: 
    //do something 
    break; 
    default: 
    if (x <= 8) 
    { 
     // do something 
    } 
    else 
    { 
     // throw exception 
    } 
    break; 
} 
+2

+1 pour le deuxième exemple.Le premier me donne envie de blesser quelqu'un. :) –

+0

Le premier exemple semble étrange: je sais que c'est vrai pour, par exemple, Java, mais le [MSDN entry] (https://msdn.microsoft.com/en-us/library/06tc147t.aspx) pour 'passer 'indique explicitement que le compilateur n'autorisera pas les" fall-throughs ". Ou est-ce que je manque quelque chose ici? – Informagic

+0

D'accord, apparemment ceci est autorisé pour les cas "vides". – Informagic

3

Réponse courte: pas. Il serait possible d'écrire tous les cas, mais une telle notation n'est pas supportée.

Je pense que vous devez utiliser if déclaration ici ou passer à une langue où il existe un meilleur support pour la discrimination de cas.

2

Si vous avez si peu de cas, if serait beaucoup préféré.

1

Vous pouvez gérer les cas explicites au cas par cas, et si vous n'avez qu'une seule plage, traitez-la dans le cas par défaut.

-1

vous pouvez faire

case 2: 
case 3: 
case 4: 
... 
case 8: 
// code here 
break 
+0

[-] Cette réponse a déjà été fournie par Andy Shellam ci-dessus. –

5

Non, mais vous pouvez écrire, vous au moins éviter d'écrire les // do something else partie à plusieurs reprises.

switch (x) 
{ 
    case 1: 
    //do something 
    break; 
    case 2: case 3: case 4: case 5: case 6: case 7: case 8: 
    //do something else 
    break; 
    default: 
    break; 
} 
+0

déjà mentionné ci-dessus, mais un point important sur le formatage :) Je me soucie de la communication –

-1

Vous pouvez utiliser l'automne cas par:

switch (x) 
{ 
    case 1: 
    //do something 
    break; 
    case 2: 
    case 3: 
    case 4: 
    case 5: 
    case 6: 
    case 7: 
    case 8: 
    //do something else 
    break; 
    default: 
    break; 
} 

Mais je voudrais juste utiliser si pour cela.

+0

[-] Cette réponse a déjà été fournie par Andy Shellam ci-dessus. –

-1

Vous ne pouvez pas utiliser d'instructions conditionnelles dans un cas de commutateur.

Si vous souhaitez exécuter les mêmes lignes de code pour les différentes options, vous pouvez faire une chose:

switch (i) 
      { 
       case 0: 
       case 1: 
       case 2: 
       case 3: 
        //do something here. 
        break; 
       default: 
        //do something here. 
        break; 
      } 
+0

[-] Réponse ci-dessus déjà fournie par Andy Shellam. –

2

Une possibilité est de convertir vos gammes en nombres entiers. Par exemple:

//assuming x>=9 or if (x <= 0) return; 
     switch((x+12)/7) 
     { case 1:Console.WriteLine("one"); 
       break; 
      case 2:Console.WriteLine("2 through 8 inclusive"); 
       break; 
      case 3:Console.WriteLine("9 through 15 inclusive"); 
       break; 
      default: Console.WriteLine("16 or more"); 
       break; 
     } 
0

Bien que cela n'a pas été possible quand je l'origine posé cette question, par le miracle de Matching C# Pattern, il est maintenant (en C# 7):

switch (i) 
{ 
    case var test when test <= 2: 
     Console.WriteLine("Less than 2"); 
     break; 

    case var test when test > 2 && test < 10: 
     Console.WriteLine("Between 2 and 10"); 
     break; 

    case var test when test >= 10: 
     Console.WriteLine("10 or more"); 
     break; 
} 

A blog post on the subject

Questions connexes