Cómo usar switch en lugar de if/else

Clase 21 de 35Curso de C# con .Net Core 2.1

Resumen

Aprende a sustituir cadenas de if/else por el operador lógico switch cuando recorres un diccionario en .NET. Verás cómo usar la llave como indicador del tipo, imprimir cada objeto con su formato, evitar casts frágiles y redondear notas a dos decimales con Math.Round y MathF.Round. Todo con buenas prácticas de legibilidad y verificación de tipos.

¿Por qué cambiar if/else por switch al recorrer un diccionario?

Al recorrer un diccionario, la llave ya “dice” el tipo del objeto asociado: escuela, alumno, asignatura, curso o evaluación. En lugar de múltiples comparaciones y else if, un switch sobre la llave simplifica y mejora la lectura.

  • Visual Studio y Visual Studio Code ofrecen snippet para switch. Ahorra tiempo y reduce errores.
  • Cada case representa un tipo de llave y concentra su lógica de impresión.
  • Con break delimitas el bloque de instrucciones para cada etiqueta.
  • Usa default para “cualquier otra cosa” no especificada.

¿Cómo estructurar el switch con keys del diccionario?

  • Cambia a un switch sobre la llave actual: si la llave es evaluación, escuela, alumno o curso, imprime según el caso. Si no coincide, cae en default y usa Console.WriteLine con el valor completo.
switch (key) { case Evaluacion: if (imprimirEvaluaciones) { // imprimir evaluación con su formato. } break; case Escuela: // impresión especial para escuela. break; case Alumno: // impresión especial para alumno. break; case Curso: // impresión especial para curso. break; default: Console.WriteLine(val); // salida por defecto. break; }
  • Detalle importante: el break va después de cada case; esta sintaxis viene de C y puede parecer “rara” si esperabas llaves por bloque.
  • Tip de mantenimiento: si detectas salidas duplicadas, revisa impresiones antiguas que hayan quedado obsoletas.

¿Cómo activar o desactivar la impresión de evaluaciones?

  • Controla la salida con un parámetro booleano: imprimir evaluaciones. Úsalo dentro del case Evaluacion para decidir si se imprime o no.
  • Para probar, ejecuta con dotnet run y ajusta el parámetro a true para ver todas las evaluaciones.

¿Cómo contar alumnos de un curso sin casts frágiles?

Imprimir cursos incluye una variante: mostrar el nombre y la cantidad de alumnos. Para obtenerla desde el valor del diccionario evita la “versión fea” del cast directo.

¿Por qué evitar el cast directo?

  • Un cast como ((Curso)val).Alumnos.Count “funciona”, pero es propenso a errores y cuesta leerlo.
// feo: cast directo override string ToString() { var cantidad = ((Curso)val).Alumnos.Count; return val.Nombre + " - Cantidad de alumnos: " + cantidad; }

¿Cómo usar as y verificación de null?

  • Prefiere un cast seguro con as y comprueba null antes de acceder. Es más claro y te “cura en salud”.
var cursoTmp = val as Curso; if (cursoTmp != null) { var cantidad = cursoTmp.Alumnos.Count; Console.WriteLine(cursoTmp.Nombre + " - Cantidad de alumnos: " + cantidad); }
  • Consejo de legibilidad: extrae conversiones “largas” a una variable local. En Visual Studio, usa “control punto” para extraer a variable local y limpiar el bloque.
  • Mantén el código compacto sin sacrificar calidad: claridad primero.

¿Cómo redondear evaluaciones a dos decimales en .NET?

Las notas se generan y luego se redondean a dos decimales para que “parezcan notas reales”. Hay dos rutas: Math.Round (devuelve double) y MathF.Round (devuelve float).

¿Cuándo usar Math.Round vs MathF.Round?

  • Si tu dato final es float y usas Math.Round, conviertes el resultado a float después del redondeo.
  • Si trabajas en float de punta a punta, usa MathF.Round y evitas conversiones extra.
// Math.Round: devuelve double, convértelo al final a float. float nota = (float)Math.Round( /* expresión que calcula la nota, produce double */, 2 ); // MathF.Round: trabaja con float de extremo a extremo. float nota = MathF.Round( /* expresión en float */, 2 );

¿Cómo resolver el error de conversión double a float?

  • Identifica de dónde sale el double: por ejemplo, un next.double multiplicado por un entero produce double.
  • Ordena la expresión y coloca los paréntesis donde corresponde. La conversión a float debe aplicarse sobre el resultado completo, no sobre partes sueltas.
  • Con orden, el compilador deja de “pelear” y el redondeo a dos cifras funciona como esperas.

¿Cómo validar el resultado en tiempo de ejecución?

  • Ejecuta con dotnet run y revisa la salida: alumnos, asignaturas y escuelas con sus formatos. Si activaste la bandera, verás evaluaciones redondeadas a dos decimales.
  • Observación de datos: un generador pseudoaleatorio puede repetir valores con frecuencia. Si notas patrones repetidos, podrías optimizar esa parte más adelante.

¿Tú cómo mejorarías la generación de notas y el formateo de impresión por tipo de llave? Comparte tu enfoque y sugerencias en los comentarios.