Estoy escribiendo varias declaraciones de cambio anidadas con bastantes casos en algunos lugares.
Estoy tratando de encontrar una manera de crear una lista de casos para luego hacer referencia en declaraciones de cambio posteriores.
¿Hay alguna forma de hacer esto?
Ciertamente limpiaría mi código.
Por ejemplo, tengo cuatro casos separados para una respuesta "sí".
Estoy buscando una manera de almacenar estos cuatro casos en una variable y llamar a esa variable cada vez que quiero usarlos en un interruptor.
Console.Write("\nWere you feeling exhausted? "); response = Console.ReadLine().ToLower(); Console.Clear(); switch (response) { case "yes": case "y": case "yep": case "yeah": { goto ThreeTwo; } case "no": case "n": case "nope": case "nah":Una buena manera limpia de hacer esto es primero declarar una enum para representar los valores de respuesta. Necesitará "Sí", "No" e "Indefinido" (este último para representar una respuesta que no es ni "Sí" ni "No"):
public enum YesOrNo { Undefined, Yes, No }Luego puede envolver la lógica de detección sí/no en una clase. Hay muchas maneras de hacer esto; aquí hay uno simple (en su lugar, podría usar un diccionario, pero para un número tan pequeño de cadenas no es realmente necesario, y estoy tratando de mantener esto lo más simple posible):
public static class YesOrNoDetector { static readonly string[] _yesAnswers = { "yes", "y", "yep", "yeah", "affirmative" }; static readonly string[] _noAnswers = { "no", "n", "nah", "nope", "negative" }; public static YesOrNo Detect(string answer) { if (_yesAnswers.Contains(answer.ToLower())) return YesOrNo.Yes; if (_noAnswers.Contains(answer.ToLower())) return YesOrNo.No; return YesOrNo.Undefined; } }(Observe cómo también maneja las respuestas en mayúsculas al convertir la cadena a minúsculas antes de comparar).
Entonces su código original se convierte en algo como:
switch (YesOrNoDetector.Detect(response)) { case YesOrNo.Yes: { goto ThreeTwo; // Please get rid of this goto! } case YesOrNo.No: { // Handle "No". break; } case YesOrNo.Undefined: { // Handle incorrect answer. break; } }Tener esta enumeración:
public enum Answers { Other, Yes, No }Se puede añadir cualquier posibilidad esperada.
También se pueden crear varias enumeraciones para varios casos de uso.
Aquí Other significa no definido, no previsto, desconocido, etc.
Podemos definir esta tabla de adjudicación/distribución/despacho:
using System; using System.Collections.Generic; readonly Dictionary<Answers, List<string>> AcceptedAnswers = new Dictionary<Answers, List<string>> { { Answers.Yes, new List<string> { "yes", "y", "yep", "yeah" } }, { Answers.No, new List<string> { "no", "n", "nope", "nah" } } };Por lo tanto, podemos definir fácilmente sinónimos para cada valor de enumeración.
Y lo usaremos definiendo este método de verificación:
Answers GetAnswer(string input) { foreach ( Answers item in Enum.GetValues(typeof(Answers)) ) if ( AcceptedAnswers.ContainsKey(item) ) if ( AcceptedAnswers[item].Contains(input) ) return item; return Answers.Other; }Prueba
Console.WriteLine("Do you agree?"); var answer = GetAnswer(Console.ReadLine()); Console.WriteLine(); Console.WriteLine($"Your answer is: {answer}.");Producción
Do you agree? yep Your answer is: Yes.Uso avanzado
bool retry; do { retry = false; Console.WriteLine("Do you agree?"); var answer = GetAnswer(Console.ReadLine()); Console.WriteLine(); Console.WriteLine($"Your answer is: {answer}."); switch ( answer ) { case Answers.Yes: // ... break; case Answers.No: // ... break; default: Console.WriteLine(); Console.WriteLine("I don't understand :("); Console.WriteLine(); retry = true; break; } } while ( retry ); Do you agree? I don't know Your answer is: Other. I don't understand :( Do you agree? yeah Your answer is: Yes.No use goto más de una vez por siglo.
¿Cómo resolver este error de compilación "Usando la variable local no asignada 'hak'" al usar goto?