¿Puedo escribir el cambio de caso en C # como este?
switch (string) case [a..z]+ // do something case [A..Z]+ // do something ....Sí, puede hacerlo en C# 7 (y nadie se dio cuenta de que había usado el carácter de rango incorrecto en la clase de caracteres .. en lugar de - ). Actualizado ahora con un ejemplo un poco más útil que realmente funciona:
using System.Text.RegularExpressions; string[] strings = {"ABCDEFGabcdefg", "abcdefg", "ABCDEFG"}; Array.ForEach(strings, s => { switch (s) { case var someVal when new Regex(@"^[az]+$").IsMatch(someVal): Console.WriteLine($"{someVal}: all lower"); break; case var someVal when new Regex(@"^[AZ]+$").IsMatch(someVal): Console.WriteLine($"{someVal}: all upper"); break; default: Console.WriteLine($"{s}: not all upper or lower"); break; } });Producción:
ABCDEFGabcdefg: not all upper or lower abcdefg: all lower ABCDEFG: all upperUn refinamiento menor en la excelente respuesta de David usando _ como descarte. Solo un valor de cadena muy simple como ejemplo.
using System; using System.Text.RegularExpressions; public class Program { public static void Main() { string userName = "Fred"; int something = 0; switch (true) { case bool _ when Regex.IsMatch(userName, @"Joe"): something = 1; break; case bool _ when Regex.IsMatch(userName, @"Fred"): something = 2; break; default: break; } Console.WriteLine(something.ToString()); } }A partir de C# 8.0, la respuesta ahora es ¡SÍ!... más o menos.
Con 8.0, se introdujo la expresión de cambio . Puede usarlo para combinar muchos estilos diferentes de patrones como se muestra a continuación.
string myValueBeingTested = "asdf"; string theResultValue = myValueBeingTested switch { var x when Regex.IsMatch(x, "[a..z]+") => "everything is lowercase", var y when Regex.IsMatch(y, "[A..Z]+") => "EVERYTHING IS UPPERCASE", "Something Specific" => "The Specific One", _ => "The default, no match scenario" }; Cómo funciona: la expresión de cambio necesita una variable en la que pueda alimentar los resultados. El ejemplo anterior usa la variable theResultValue para eso. A continuación, pasa al interruptor lo que se conoce como la expresión de rango representada por myValueBeingTested arriba. La construcción de caso familiar se reemplaza con una expresión de patrón seguida por el token => y juntos se denominan brazo de expresión . Cualquier cosa en el lado derecho del token de brazo terminará en la variable de resultado.
Normalmente, la expresión de cambio requiere que los patrones sean una constante de tiempo de compilación, y no puede ejecutar código arbitrario dentro de una expresión de cambio . Sin embargo, podemos usar un patrón de protección de casos usando la cláusula when para hacer uso de Regex como se muestra arriba. Cada caso debe conectarse en un brazo distinto con distintas variables desechables ( x e y arriba).
El tercer brazo que se muestra arriba es una cadena constante de tiempo de compilación para que coincida con algún texto específico si lo desea. El cuarto brazo que se muestra arriba usa el patrón _ , que es una especie de comodín similar a la antigua palabra clave default: También puede usar null en lugar de, o además de _ para manejar casos nulos por separado de cualquier otra cosa.
Pruébelo en mi ejemplo de .NET Fiddle aquí .