Cálculo del Promedio de Notas Agrupadas por Alumno y Asignatura
Clase 29 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
08:32 min - 28

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

Cálculo del Promedio de Notas Agrupadas por Alumno y Asignatura
Viendo ahora - 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
Calcular el promedio de notas por alumno es directo si entiendes el agrupamiento y las expresiones lambda en linq. Aquí verás cómo definir correctamente la clave del grupo, evitar errores comunes y obtener el promedio con Average sin mezclar campos que rompan la lógica del cálculo.
¿Qué problema resolvemos y por qué el orden del agrupamiento importa?
Necesitamos agrupar las evaluaciones por asignatura y por alumno para obtener el promedio de su nota. El orden del agrupamiento es clave: primero asignatura y luego alumno. Si se invierte, terminas con alumnos y dentro de cada uno todas sus asignaturas, lo cual no sirve para el objetivo planteado.
- Primero agrupar por asignatura. Luego por alumno dentro de la asignatura.
- La clave del grupo debe ser el ID único del alumno.
- No incluyas la nota en la clave: crearías grupos por nota repetida, lo cual no corresponde.
¿Cómo acceder a la key del grupo sin crear un objeto nuevo?
Tras agrupar, el grupo expone su key. Si no defines un “nuevo objeto” para la clave, la key es directamente el valor agrupado (el unique ID del alumno). Puedes mapearlo a un nombre legible en la proyección final.
- key representa el identificador del grupo.
- Asignar un alias mejora la lectura: alumnoID = grupoEvaluacionesAlumno.Key.
Ejemplo de la idea en código dentro del contexto ya filtrado por asignatura:
var grupoEvaluacionesAlumno = evaluaciones.GroupBy(e => e.AlumnoUniqueID);
var resultado = grupoEvaluacionesAlumno.Select(g => new {
alumnoID = g.Key,
promedio = g.Average(evaluacion => evaluacion.nota)
});
¿Cómo calcular el promedio con average y expresiones lambda?
Una vez tengas el grupo por alumno, usa Average indicando con una expresión lambda qué campo promediar: la nota. Recuerda que, tras agrupar, la variable original eval puede ya no existir en ese contexto; usa el parámetro de la lambda.
- Average necesita un selector: elemento => elemento.nota.
- No agregues nota a la clave del grupo: solo úsala en el selector del Average.
- Delegado, predicado y lambda: usa lambda por ser la forma más corta y clara.
Fragmento representativo:
var promedioPorAlumno = grupos.Select(g => new {
alumnoID = g.Key,
promedio = g.Average(evaluacion => evaluacion.nota)
});
¿Qué errores comunes aparecen y cómo depurar?
Durante la implementación es normal topar con detalles de sintaxis y de flujo. Detectarlos rápido ahorra tiempo.
- Falta de punto y coma: valida que la instrucción esté completa.
- Nombrado consistente: usa UniqueID/AlumnoUniqueID exactamente, respetando mayúsculas/minúsculas.
- Contexto tras agrupar: eval ya no existe; usa el parámetro de la lambda.
- Invocación del método: recuerda llamar a la función que obtiene el promedio por asignatura desde el programa principal.
- Nivel correcto: el método debe estar en la clase adecuada, no “flotando”.
- Compilación para ver errores: ejecuta dot net build para obtener diagnósticos claros.
- Depuración con puntos de interrupción: inspecciona variables como dummy para verificar IDs y promedios.
- Estructura de salida: el resultado intermedio es por una asignatura; agrega cada dummy a una colección general por asignatura.
- Tipo del diccionario: DObject funciona como temporal, pero luego habrá que resolver el manejo del tipo anónimo al guardar en el diccionario.
¿Cómo estructurar la salida por asignatura?
El cálculo mostrado construye el promedio para la asignatura en curso. Para consolidar:
- Crea una lista o diccionario por asignatura y agrega cada resultado parcial.
- Usa la asignatura como clave de nivel superior y el alumnoID como clave interna.
- Posteriormente reemplaza DObject para tipar correctamente el resultado de los tipos anónimos.
Si te interesa ver variantes o mejorar la proyección final, comenta: ¿qué forma de salida te sirve más, lista de objetos o diccionario por asignatura y alumno?