republica - Evaluar expresiones en declaraciones de cambio en C#
instructivo formulario no 1 banco de la republica (9)
Tengo que implementar lo siguiente en una declaración switch
:
switch(num)
{
case 4:
// some code ;
break;
case 3:
// some code ;
break;
case 0:
// some code ;
break;
case < 0:
// some code ;
break;
}
¿Es posible hacer que la declaración del interruptor evalúe el case < 0
? Si no, ¿cómo podría hacer eso?
A la inversa también sería posible (en relación con la respuesta de Jon Skeet):
switch(num)
{
case a:
break;
default:
if( num < 0 )
{}
break;
}
La única forma en que podría pensar (y realmente no lo recomiendo) sería la siguiente:
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;
}
Lo que podrías hacer es usar un delegado como este.
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();
Simplemente intercambie lo que desea realizar donde está la Información de registro ("x") y tiene su declaración de "cambio".
Necesitará algún tipo de manejo de errores si busca una clave que sea "encontrada" por el Func.
No puede - cambiar / caso es solo para valores individuales. Si desea especificar condiciones, necesita un "si":
if (num < 0)
{
...
}
else
{
switch(num)
{
case 0: // Code
case 1: // Code
case 2: // Code
...
}
}
No puede usar comparaciones en switches como podría en VB, tiene 2 opciones aquí, reemplace el valor que enciende con un valor conocido y use eso o, si se refiere a todos los demás casos, puede usar la cláusula predeterminada:
switch(num)
{
case 4:
// some code ;
break;
case 3:
// some code ;
break;
case 0:
// some code ;
break;
default:
// some code ;
break;
}
Tenga en cuenta que esto no es exactamente como usted lo solicitó: cualquier valor que no sea 0,3,4 terminará en la cláusula deafult:
Puede hacer algo como esto al final de su declaración de cambio:
default:
if(num < 0)
{
... // Code
}
break;
Sé que este tema es bastante antiguo, pero si alguien sigue buscando la respuesta ahora en C # 7, es posible. Aquí hay un ejemplo:
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;
}
Si tu num no puede ser menor que cero:
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 puede, use otro número "inexistente" como int.MinValue.
Tendrá que usar si quiere o no. Switch solo es capaz de comparar tu valor con valores constantes.