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.