Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

173
Views
¿Cómo refactorizar estos casos de cambio para manejar la elección del usuario en lenguaje natural?

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":
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

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; } }
over 4 years ago · Santiago Trujillo Report

0

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?

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!