Je dois implémenter les éléments suivants dans une instruction switch
:
switch(num)
{
case 4:
// some code ;
break;
case 3:
// some code ;
break;
case 0:
// some code ;
break;
case < 0:
// some code ;
break;
}
Est-il possible que l'instruction switch évalue case < 0
? Sinon, comment pourrais-je faire cela?
Vous ne pouvez pas - switch/case est uniquement pour les valeurs individuelles. Si vous souhaitez spécifier des conditions, vous avez besoin d'un "si":
if (num < 0)
{
...
}
else
{
switch(num)
{
case 0: // Code
case 1: // Code
case 2: // Code
...
}
}
Je sais que ce sujet est assez ancien mais si quelqu'un cherche toujours la réponse en C # 7, c'est possible. Voici un exemple:
switch (value)
{
case var expression when value < 0:
//some code
break;
case var expression when (value >= 0 && value < 5):
//some code
break;
default:
//some code
break;
}
Vous pouvez faire quelque chose comme ceci à la fin de votre instruction switch:
default:
if(num < 0)
{
... // Code
}
break;
Si votre num ne peut pas être inférieur à zéro:
public int GetSwitch(int num) { return num < 0 ? -1 : num; }
switch(GetSwitch(num))
{
case 4: // some code ; break;
case 3:// some code ; break;
case 0: // some code ; break;
case -1 :// some code ; break;
}
Si c'est le cas, utilisez un autre nombre "inexistant" tel que int.MinValue.
Vous devrez utiliser si, que vous le vouliez ou non. Switch est uniquement capable de comparer votre valeur à des valeurs constantes.
La seule façon de penser (et je ne le recommande vraiment pas) serait la suivante:
int someValue;
switch (Math.Max(someValue, -1))
{
case -1:
// will be executed for everything lower than zero.
break;
case 0:
// will be executed for value 0.
break;
case 1:
// will be executed for value 1.
break;
default:
// will be executed for anything else.
break;
}
tu peux le faire
switch (mark)
{
case int n when n >= 80:
Console.WriteLine("Grade is A");
break;
case int n when n >= 60:
Console.WriteLine("Grade is B");
break;
case int n when n >= 40:
Console.WriteLine("Grade is C");
break;
default:
Console.WriteLine("Grade is D");
break;
}
L'inverse serait également possible (concernant la réponse de Jon Skeet):
switch(num)
{
case a:
break;
default:
if( num < 0 )
{}
break;
}
Ce que vous pourriez faire, c'est d'utiliser un délégué comme celui-ci.
var actionSwitch = new Dictionary<Func<int, bool>, Action>
{
{ x => x < 0 , () => Log.Information("0")},
{ x => x == 1, () => Log.Information("1")},
{ x => x == 2, () => Log.Information("2")},
{ x => x == 3, () => Log.Information("3")},
{ x => x == 4, () => Log.Information("4")},
{ x => x == 5, () => Log.Information("5")},
};
int numberToCheck = 1;
//Used like this
actionSwitch.FirstOrDefault(sw => sw.Key(numberToCheck)).Value();
Échangez simplement ce que vous ne voulez pas faire là où se trouve Log.Information ("x") et vous obtenez votre instruction "switch".
Vous aurez besoin d'une gestion des erreurs si vous recherchez une clé qui est "trouvée" par le Func.
Si vous aimez voir la version Func du commutateur, je viens d'écrire un article de blog avec un exemple de chapitre sur Switch .
Vous ne pouvez pas utiliser des comparaisons dans les commutateurs comme vous le pourriez dans VB, vous avez 2 options ici, remplacez la valeur que vous allumez par une valeur connue et utilisez-la ou - si vous voulez dire tous les autres cas - vous pouvez utiliser la clause par défaut:
switch(num)
{
case 4:
// some code ;
break;
case 3:
// some code ;
break;
case 0:
// some code ;
break;
default:
// some code ;
break;
}
Notez que cela ne correspond pas exactement à ce que vous avez demandé: toute valeur autre que 0,3,4 se retrouvera dans la clause deafult :.
J'ai rencontré récemment le modèle suivant, et bien que je le déteste, je ne peux pas affirmer que ce n'est pas pratique:
switch(0)
{
case 0 when x < 0:
...
break;
case 0 when a > 5 && x == 0:
...
break;
}
L'utilisation d'expressions fictives ((0)
dans le commutateur, et case 0
) est absolument terrible, et je détesterais qu'il devienne un idiome, mais bon - c'est concis et très clair. Bien sûr, ce n'est pas un hack qui obscurcit complètement le sens et a besoin de connaissances arcaniques. Mais C # ferait bien d'éviter le besoin. Je voudrais que ce qui suit soit légal:
switch // maybe () here, if the grammar would demand
{
case when x < 0: // I like the case to stay
...
case when a > 5 && x == 0:
...
}