Generación de Alumnos Aleatorios en Cursos Educativos

Clase 29 de 32Fundamentos de C# con NET Core 2.1

Resumen

Aprende a depurar en C# con autoridad: corrige referencias nulas, genera datos de prueba consistentes con LINQ y asigna alumnos por curso de forma aleatoria con Random. Aquí verás cómo evitar errores comunes, nombrar mejor tus métodos y convertir resultados a listas para trabajar sin fricción.

¿Cómo detectar y corregir referencias nulas en C# durante el debug?

En Visual Studio Code, un punto de interrupción reveló una excepción por referencia nula al asignar asignaturas al curso. La causa: la lista de asignaturas del curso no estaba inicializada. La solución: inicializar la colección o asignar la lista creada antes de usarla.

  • Usa el debug para inspeccionar variables en tiempo de ejecución.
  • Identifica objetos nulos antes de agregarles elementos.
  • Inicializa listas en las entidades para garantizar estados válidos.

Ejemplo de inicialización segura en la entidad Curso:

public class Curso
{
    public List<Asignatura> Asignaturas { get; set; } = new List<Asignatura>();
}

O asignación directa de una lista ya creada:

curso.Asignaturas = listaDeAsignaturas;

Tip de diseño: renombrar métodos para reflejar su intención ayuda a mantener el código claro. Si un método no “carga” sino que “crea” alumnos, cámbiale el nombre.

// Antes
List<Alumno> CargarAlumnos(int cantidad) { /* ... */ }

// Después
List<Alumno> GenerarAlumnosAlAzar(int cantidad) { /* ... */ }

¿Cómo generar alumnos con LINQ, unique ID y listas en C#?

Se creó un producto cartesiano con LINQ para combinar fragmentos de nombres y apellidos. Resultado destacado: 391 alumnos generados al instante, cada uno con identificador único usando Guid.

  • Usa OrderBy con una clave estable para variar resultados cuando apliques Take.
  • Devuelve List en lugar de IEnumerable si tu dominio trabaja con listas.
  • Emplea Guid para UniqueId al instanciar cada alumno.

Ejemplo de ordenamiento, truncado y conversión a lista:

List<Alumno> GenerarAlumnosAlAzar(int cantidad)
{
    var alumnos = listaAlumnos
        .OrderBy(a => a.UniqueId)   // orden aleatorio efectivo si UniqueId se crea al instanciar
        .Take(cantidad)
        .ToList();                  // trabajar con List

    return alumnos;
}

Definición de identificador único con Guid:

public class Alumno
{
    public string UniqueId { get; } = Guid.NewGuid().ToString();
    public string Nombre { get; set; }
}

Insight práctico: si solo haces Take(cantidad) sobre la misma fuente, los mismos N alumnos se repetirán en todos los cursos. El ordenamiento por UniqueId cambia el orden y evita duplicidades entre cursos.

¿Cómo asignar alumnos aleatorios por curso con Random en .NET?

Para evitar cursos con 300+ alumnos y simular escenarios reales, se limitó y varió la cantidad por curso con Random. Observación reveladora: ubicar la cantidad fuera del bucle generó el mismo número (p. ej., 12) en varios cursos; mover el cálculo dentro del foreach solucionó el patrón repetido y produjo valores como 10, 11, 12, 13 en distintas iteraciones.

  • Genera tamaños de curso con Random.Next en un rango razonable (por ejemplo, 5 a 20).
  • Calcula la cantidad dentro del foreach para obtener valores distintos por curso.
  • Asigna a cada curso una lista nueva de alumnos generada al azar.

Implementación típica:

var rnd = new Random();

foreach (var c in escuela.Cursos)
{
    int cantidad = rnd.Next(5, 20);              // entre 5 y 20
    c.Alumnos = GenerarAlumnosAlAzar(cantidad);  // alumnos únicos por ordenamiento
}

¿Qué habilidades refuerzas con este flujo?

  • Depuración con puntos de interrupción y panel de variables.
  • Manejo de referencias nulas e inicialización de colecciones.
  • Uso de LINQ: OrderBy, Take y colecciones proyectadas.
  • Conversión de IEnumerable a List con ToList para operar en dominio.
  • Generación de datos de prueba: producto cartesiano y Random.
  • Identificadores únicos con Guid.
  • Buenas prácticas de nombres y refactoring para mover responsabilidades a nuevas clases (como una clase estática Printer para títulos y pitidos).
  • Revisión de tipos numéricos: double, decimal, float.

¿Qué keywords y datos relevantes conviene recordar?

  • Visual Studio Code, debug, punto de interrupción, referencia nula.
  • Curso, Asignatura, Alumno, Evaluación, Escuela.
  • LINQ, OrderBy, Take, IEnumerable, ToList, Guid, Random.
  • Producto cartesiano para generar 391 alumnos.
  • Rango de alumnos por curso con Random: entre 5 y 20.
  • Próximo paso: carga de evaluaciones.

¿Tú cómo limitarías los alumnos por curso y qué criterio de orden usarías para variar resultados? Comparte tu enfoque y decisiones de diseño en los comentarios.