Diccionarios con polimorfismo en C#
Clase 16 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#
Viendo ahora - 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
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
Implementa un diccionario robusto en C# para organizar tu modelo escolar con claves de tipo string y colecciones tipadas. Aquí verás cómo evitar excepciones por llaves duplicadas, cómo aprovechar el polimorfismo y por qué conviene devolver una interfaz como IEnumerable en lugar de una List concreta. Todo, paso a paso, desde Visual Studio.
¿Qué construimos con un diccionario string a objetos en C#?
Un método que devuelva un Dictionary
- Claves legibles: "escuela", "cursos".
- Valores consistentes: siempre una colección de ObjetoEscuelaBase.
- Método claro: get diccionario de objetos.
Ejemplo en C#:
public Dictionary<string, IEnumerable<ObjetoEscuelaBase>> GetDiccionarioDeObjetos()
{
var diccionario = new Dictionary<string, IEnumerable<ObjetoEscuelaBase>>();
// escuela: un único objeto envuelto en colección.
diccionario.Add("escuela", new ObjetoEscuelaBase[] { escuela });
// cursos: conversión explícita a la jerarquía base.
IEnumerable<ObjetoEscuelaBase> cursosComoBase = cursos.Cast<ObjetoEscuelaBase>();
diccionario.Add("cursos", cursosComoBase);
return diccionario;
}
¿Cómo evitamos colisiones de llave y valores incompatibles?
Agregar varias veces la misma clave (por ejemplo, "cursos") provoca una excepción por llave duplicada. La solución no es inventar claves como "curso2" o "curso3", sino usar una sola clave y entregar todos los cursos como colección.
- Un valor por clave: evita repetir "cursos" para cada curso.
- Colección única: agrupa todos los cursos debajo de "cursos".
- Envoltura mínima: para "escuela", usa un array de una posición.
Fragmento clave:
// Escuela como colección (array de 1 elemento).
diccionario.Add("escuela", new ObjetoEscuelaBase[] { escuela });
// Todos los cursos en una sola entrada.
diccionario.Add("cursos", cursos.Cast<ObjetoEscuelaBase>());
¿Por qué usar IEnumerable y hacer casting con polimorfismo?
Aunque un curso hereda de ObjetoEscuelaBase, una List
- Polimorfismo: Curso es compatible con ObjetoEscuelaBase.
- Colecciones genéricas: List de derivados no hereda de List de base.
- Interfaz genérica: usa IEnumerable
en el diccionario. - Conversión clara: aplica .Cast
() a la colección de cursos.
Código ilustrativo:
// List<Curso> cursos; // colección concreta
// Convertimos al tipo base, como interfaz (no como List).
IEnumerable<ObjetoEscuelaBase> cursosComoBase = cursos.Cast<ObjetoEscuelaBase>();
// El diccionario expone IEnumerable, compatible con el resultado de Cast.
var diccionario = new Dictionary<string, IEnumerable<ObjetoEscuelaBase>>
{
{ "escuela", new ObjetoEscuelaBase[] { escuela } },
{ "cursos", cursosComoBase }
};
Puntos clave del diseño:
- Exponer interfaces: IEnumerable ofrece flexibilidad y encaja con .Cast<>.
- Evitar casting inválido: no intentes convertir List
a List . - Uniformidad: el valor del diccionario siempre es colección, incluso para un único elemento.
¿Qué habilidades y conceptos practicas aquí?
- Diseño de API: firmas claras que devuelven interfaces.
- Estructuras de datos: Dictionary con clave string y valor colección tipada.
- Polimorfismo práctico: derivados convertidos a la clase base.
- Conversión explícita: uso de .Cast<> con colecciones.
- Manejo de errores: prevención de excepción por llave duplicada.
¿Te gustaría ver variantes con otras colecciones o claves adicionales del dominio? Cuéntame en comentarios qué caso quieres mapear y lo construimos juntos.