Diccionario con evaluaciones por asignatura
Clase 27 de 35 • Curso de C# con .Net Core 2.1
Contenido del curso
Etapa 5 – POO reutilicemos nuestro código
- 2

Herencia para reutilizar código C#
10:30 min - 3

Herencia y Polimorfismo en Programación Orientada a Objetos
11:42 min - 4

Polimorfismo en Programación Orientada a Objetos
13:17 min - 5

Casting en C#: cuándo funciona y cuándo falla
07:09 min - 6

Conversiones seguras en C# con is y as
12:44 min - 7

Sobrescribir ToString para depuración en C#
08:15 min
Etapa 6- Ajustes y funcionalidad
Etapa 7 – Preparando información para nuestros reportes
- 11

Manejo Avanzado de Métodos y Parámetros en Programación
15:43 min - 12

Manejo de Parámetros de Salida en Visual Studio Code
04:38 min - 13

Sobrecarga de Métodos para Parámetros de Salida Opcionales
05:51 min - 14

Optimización de Listas: Buenas Prácticas en C#
04:16 min - 15

Dictionary: cómo funciona en C#
11:14 min - 16

Diccionarios con polimorfismo en C#
10:48 min - 17

Uso de Constantes y Enumeraciones para Optimizar Diccionarios en C#
11:33 min - 18

Foreach anidado para diccionarios en C#
13:47 min - 19

Depuración de diccionarios en C#
09:37 min - 20

Parámetro opcional para controlar impresión en C#
11:47 min - 21

Cómo usar switch en lugar de if/else
14:30 min - 22

Números aleatorios y eventos en C#
12:52 min - 23

Diccionarios y Refactoring en Programación Básica
02:13 min
Etapa 8 – Consultas
- 24

Cómo crear un reporteador en C sharp
11:42 min - 25

Generación segura de reportes en sistemas de información
10:21 min - 26

Construcción de reportes con LINQ en C#
11:48 min - 27

Diccionario con evaluaciones por asignatura
Viendo ahora - 28

Tipos anónimos en LINQ para reportes complejos
10:52 min - 29

Cálculo del Promedio de Notas Agrupadas por Alumno y Asignatura
10:46 min - 30

Creación de Tipos de Datos Personalizados en Programación Avanzada
12:05 min - 31

Generación de Reportes con LINQ en C#
02:09 min
Etapa 9 – Creando una UI de Consola
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.