Diccionario con evaluaciones por asignatura

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

Resumen

Optimiza la generación de reportes en C sharp con un enfoque claro: construir un diccionario de evaluaciones por asignatura reutilizando consultas, aplicando LINQ y usando una sobrecarga que mejora la ergonomía del código. Verás cómo combinar IEnumerable<Evaluación>, from, select, where, foreach y distinct para lograr un diseño eficiente y mantenible.

¿Por qué reutilizar consultas y usar variable de salida en get lista de asignaturas?

Evitar trabajos duplicados es clave. Ya existe un método que arma la lista de asignaturas y, de forma interna, obtiene la lista de evaluaciones. Para no repetir el query, se expone esa lista como variable de salida.

  • POO: hacer menos esfuerzo con más funcionalidad. Reutilizar trabajo previo.
  • Evitar doble query. La misma consulta no debe ejecutarse dos veces.
  • Variable de salida: tipo IEnumerable<Evaluación> para entregar las evaluaciones.
  • Ergonomía: a veces no se necesita el parámetro de salida, por eso se crea una sobrecarga.

Código de ejemplo del patrón aplicado:

// Método que retorna asignaturas y también la lista de evaluaciones como variable de salida IEnumerable<Asignatura> getListaDeAsignaturas(out IEnumerable<Evaluación> listaEvaluaciones) { // Internamente ya se obtiene la lista de evaluaciones. // También se retorna la lista de asignaturas (obtenida, por ejemplo, con distinct). } // Sobrecarga para cuando no se necesita la variable de salida IEnumerable<Asignatura> getListaDeAsignaturas() { IEnumerable<Evaluación> dummy; return getListaDeAsignaturas(out dummy); }

¿Qué evita hacer dos queries redundantes?

  • Un solo origen de verdad: el método que ya consulta evaluaciones las entrega por salida.
  • Menos costo: no repetir la ejecución del mismo query LINQ.
  • Código más nítido: responsabilidad concentrada y fácil de mantener.

¿Cómo se implementa la sobrecarga para comodidad?

  • Mismo nombre, distinta firma. No pedir la variable de salida cuando no se use.
  • Internamente llama al método principal. Devuelve la misma lista de asignaturas.
  • Flujo de trabajo más fluido. Se evita “aburridor” paso de parámetros innecesarios.

¿Cómo filtrar evaluaciones por asignatura con LINQ where y select?

Con la lista de asignaturas y la lista de evaluaciones disponibles, se recorre cada asignatura y se filtran solo sus evaluaciones. Se construye un diccionario cuya llave es el nombre de la asignatura y cuyo valor es la secuencia de evaluaciones.

  • foreach por asignatura. Iterar sobre listaAsignaturas.
  • LINQ: from, where y select para filtrar por nombre de asignatura.
  • Diccionario llave-valor: nombre de la asignatura → evaluaciones correspondientes.

Código de ejemplo del núcleo de construcción:

// Supongamos que ya tenemos estas variables: IEnumerable<Asignatura> listaAsignaturas = getListaDeAsignaturas(out IEnumerable<Evaluación> listaEvaluaciones); var evalsPorAsignatura = new Dictionary<string, IEnumerable<Evaluación>>(); foreach (var asignatura in listaAsignaturas) { var evalsAsignatura = from e in listaEvaluaciones where e.Asignatura.Nombre == asignatura.Nombre select e; evalsPorAsignatura.Add(asignatura.Nombre, evalsAsignatura); }

¿Qué rol cumple distinct en las asignaturas?

  • Asegura unicidad. Una asignatura por nombre, sin duplicados.
  • Evita colisiones en el diccionario. Claves únicas por asignatura.
  • Bucle seguro: no falla por claves repetidas.

¿Cómo se asegura la claridad del código?

  • Formateo rápido: alt, shift, f para ordenar el código.
  • Nombres expresivos: listaAsignaturas, listaEvaluaciones, evalsAsignatura.
  • Depuración sin fricción: puntos de interrupción cuando haga falta.

¿Qué resultados arroja el reporte y qué sigue con los promedios?

Al ejecutar la construcción del diccionario desde reporteador, se observa que se generan cuatro entradas, una por cada materia de la solución. Cada entrada mapea a su lista de evaluaciones.

  • Ejemplo en Matemáticas: se listan evaluaciones por persona. Álvaro Freid tiene varias notas, como “cuatro noventa y siete”, “cero noventa y siete”, “cero ochenta y dos”.
  • Ejemplo en Ciencias Naturales: aparecen integrantes de la familia Maduro, como Álvaro Anabel Maduro, Donald Silvana Maduro y Alba Diomedes Maduro, con registros como “cero cuarenta y nueve” y luego “cuatro siete”.
  • Verificación en depuración: el diccionario muestra 4 materias y cada clave contiene su lista de evaluaciones.
  • Próximo paso: construir un reporte que entregue el promedio de cada alumno en cada asignatura.

¿Cómo se invoca el reporte desde reporteador?

  • Llamada directa: getListaDeEvaluacionesPorAsignatura sin parámetros.
  • Entrega: un diccionario asignatura → evaluaciones.
  • Estado listo: insumo preparado para calcular promedios por estudiante y asignatura.

¿Tienes dudas sobre la construcción del diccionario o el filtrado con LINQ? Comparte tu pregunta y comentemos mejoras posibles en el diseño.