Generación segura de reportes en sistemas de información
Clase 25 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
Viendo ahora - 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
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
Un generador de reportes sólido parte de una idea clave: separar la extracción de datos de su presentación. Así, el reporteador se enfoca en obtener la información de las fuentes, mientras la forma de mostrarla puede variar sin afectar la lógica. Además, conviene acceder a los diccionarios de forma segura, manejar valores por defecto y usar System.Linq para hacer cast correcto de colecciones IEnumerable.
¿Por qué separar extracción y presentación en un reporteador?
La extracción y la presentación son responsabilidades distintas. El reporteador obtiene datos complejos que no siempre salen de una consulta directa a una tabla, y la presentación los muestra en el formato que convenga.
- La presentación debe ser intercambiable sin tocar la extracción.
- El reporte puede mostrarse en distintos medios sin reescribir la lógica.
- La fuente de datos se mantiene única y consistente.
¿Qué formatos de salida puede tener un reporte?
- Consola para prototipos o pruebas rápidas.
- Página web para consumo interactivo.
- Archivo de texto para compartir o archivar.
¿Cómo obtener listas con seguridad desde un diccionario?
Usar directamente GetValueOrDefault puede retornar el valor por defecto y llevar a errores silenciosos. Por ejemplo, si la clave no existe, una lista será nula y el flujo continúa como si todo estuviera bien.
- Lista por defecto: nulo.
- String por defecto: cadena vacía.
- Entero por defecto: 0.
- Booleano por defecto: false.
Ejemplo con GetValueOrDefault (retorna nulo si no encuentra la clave):
// lista tendrá null si la clave no existe
var lista = diccionario.GetValueOrDefault(llaves.Diccionario.Escuela);
En cambio, TryGetValue permite decidir qué hacer según el resultado: retorna un booleano y entrega la lista por parámetro de salida out.
using System.Linq; // necesario para .Cast<>()
IEnumerable<object> listaBase; // el diccionario guarda objetos del tipo base
bool rta = diccionario.TryGetValue(llaves.Diccionario.Escuela, out listaBase);
IEnumerable<escuela> respuesta = null;
if (rta)
{
// convierte IEnumerable<object> a IEnumerable<escuela>
respuesta = listaBase.Cast<escuela>();
}
return respuesta; // puede ser null si no se encontró la lista
- Si rta es true: tienes la lista y puedes hacer cast al tipo esperado.
- Si rta es false: puedes retornar nulo, registrar en el log o decidir otra acción.
¿Cuándo usar getValueOrDefault y cuándo tryGetValue?
- GetValueOrDefault: cuando el valor por defecto sea aceptable y evidente.
- TryGetValue: cuando necesitas confirmar la existencia y actuar según el resultado.
¿Cómo manejar nulos y auditoría?
- Si la lista de escuelas es nula y proviene de una base de datos, es un posible incidente.
- Registra el evento en el log de auditoría y define si el flujo debe continuar o detenerse.
¿Por qué usar System.Linq y cast con IEnumerable?
Las operaciones de colecciones en IEnumerable se potencian con System.Linq. Sin este namespace, muchos métodos de extensión —incluido Cast<>()— no aparecen, limitando el trabajo con colecciones y arreglos.
using System.Linq;
// ejemplo de cast tipado
IEnumerable<object> origen = ObtenerColeccionBase();
IEnumerable<escuela> escuelas = origen.Cast<escuela>();
- Agrega siempre System.Linq cuando trabajes con IEnumerable.
- Evitas errores de tipo al convertir colecciones base al tipo requerido.
- La depuración con puntos de interrupción ayuda a validar si la lista es nula o si el cast se ejecuta como se espera.
¿Te gustaría comentar cómo manejarías los nulos en tu flujo o qué estrategias de auditoría agregarías?