Generación de Alumnos Aleatorios en Cursos Educativos
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:
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.
¿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 Listreturn alumnos;}
Definición de identificador único con Guid:
publicclassAlumno{publicstring UniqueId {get;}= Guid.NewGuid().ToString();publicstring 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 =newRandom();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.
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.
Pienso que un problema de este curso... es que cambia muchas cosas ya creadas, me parece que al ser fundamentos y pensado para alguien primerizo no debería de lanzar tantas formas de hacer algo con el mismo resultado, solo sugerir la mejor forma de hacerlo. No sabes cual opción cachar y al final ninguna te acomoda xD.
Sin embargo, esta es la tercera vez que lo veo y recién entiendo cada una de las formas de hacer cada cosa y todos los cambios que hace super rápido... PARA HACER LO MISMO, PERO DE DIFERENTE FORMA. xD
Es bueno el curso, pero es mejorable.
Solo es una critica. Amor a todos.
Me parece que estas un poco equivocado, si bien es cierto que te da mucho conocimiento y múltiples formas de hacer una misma cosa; nunca sentirás que lo dominas hasta que lo practiques y practiques.
Me parece que tu comentario viene por eso, porque estas iniciando, el mejor consejo es Práctica. Le encontrarás utilidad.
Estoy 100% de acuerdo contigo. Incluso a veces hay improvisaciones. Se supone que son fundamentos, entonces hay cosas que deben ser explicadas con mas detenimiento. Por otro lado, el no respeto a los nombres en singular y plural confunde un poco. No digo que el curso sea malo, pero tiene cosas por mejorar. Llegado a esta altura del curso seguiré, pero por lo menos en mi caso, se que necesitare otro material para cubrir las dudas que me van quedando.
Con respecto a la pregunta que hace el instructor, en mi caso, no ha sido del todo fácil; explica bastantes cosas y detalles rápido y, aunque soy programador, hay cosas bastante nuevas en cuanto al lenguaje y a la metodología del desarrollo.
Sin embargo, continúo porque vale la pena algo nuevo. ¿A alguien más le pasa esto?
Yo me estoy especializando en C++ y he utilizado ampliamente Javascript, al ver este curso para meterme a aplicaciones de escritorio me ha resultado muy entendible y puedo inferir que debe mucho a que vengo de C++. Creo que depende de que lenguaje vengas, aún así veo como muchas cosas son muy fáciles como cual Javascript estuvieses programando. Me esta gustando C#. Como te sientes respecto a C#?
en el año que llevo desarrollando en Javascript, me estoy enfrentando a un proyecto en Netcore y este curso si me ayudo bastante a conocer mas .net y sacar adelante el proyecto
Sinceramente el curso ha sido BUENISIMO 10/10
Como crítica, al iniciar el curso, creo que sería bueno indicar que los estudiantes primero tomen el curso de Prog Básica y el de Prog estructurada.
Ya que las cosas "básicas" de la programación las explicó muy rápido, cosa que a mí me vino de maravilla por lo que no soy tan Novato en la prog, pero para aquellos que es su primer lenguaje y no saben nada, les puede ser muy, muy difícil tanta información.
Es totalmente cierto,recomendado el curso de programación basica.
Es importante el de POO
De un video de 15 minutos estoy 1 hora
Al usar una instancia de la clase Random e invocar el metodo Next(), este nos proporciona las siguientes sobrecargas:
Next() => que nos genera un número “aleatorio” entre 0 y el ultimo número soportado por el tipo primitivo " int ".
Next(int valorMaximo) => que nos genera un número entre 0 y el número que especificamos.
Next(int valorMinimo, int valorMaximo) => que nos genera un número entre valorMinimo y valorMaximo.
NOTA: El valor máximo que colocamos como parámetro del método Next(), NO entra entre los posibles números que queremos generar. Si queremos que el método nos genere números entre 5 y 20 (como el ejemplo) incluyendo el 20, el número máximo debe estar estimado con un " +1 "
Si deseas probar puedes copiar este código y jugar con los parámetros:
Random rnd =newRandom(); int valorMinimo =0; int valorMaximo =10;for(int i =0; i<200;i++){ int entero = rnd.Next(valorMinimo, valorMaximo+1);//se le suma 1 al máximo para que aparezcaConsole.WriteLine(entero);}
Si quieres probarlo sin alterar tu proyecto sigue este enlace:
:
:thumbsup:
Realmente ando siguiendo lentamente cada paso, por lo que estoy haciendo un simple copy paste, me tardo bastante en entender como se comunica cada archivo y en si mismo como es que funciona cada propiedad que le agregamos a la escuela.
Por ahí estaba pensando en cuanto termine, agregarle una especie de grado especial, tipo refuerzo y que lleve a alumnos automáticamente que tenga notas bajas. Pero eso mas adelante.
Modifique un poco el código. Cree un método para asignar alumnos a cada curso que llama a CrearAlumnos, y que toma un parámetro int que va a ser una variable random inicializada en el primer método que mencione.
Así solo se crea una cantidad moderada de alumnos por curso y no se crean los 391 objetos cada vez que se llama al método para crear alumnos.
Gran clase!!! Estoy aprendiendo cada vez más
privateList<Alumno>CrearAlumnos(int cantidad){ string[] nombre1 ={"Alba","Felipa","Eusebio","Farid","Donald","Alvaro","Nicolás"}; string[] apellido1 ={"Ruiz","Sarmiento","Uribe","Maduro","Trump","Toledo","Herrera"}; string[] nombre2 ={"Freddy","Anabel","Rick","Murty","Silvana","Diomedes","Nicomedes","Teodoro"};var listaAlumnos =from n1 in nombre1
from n2 in nombre2
from a1 in apellido1
select newAlumno{Nombre= $"{n1}{n2}{a1}"};return listaAlumnos.OrderBy((al)=> al.UniqueId).Take(cantidad).ToList();}privatevoidCargarCursos(){Escuela.Cursos=newList<Curso>(){newCurso{Nombre="101",Jornada=TiposJornada.Mañana},newCurso{Nombre="201",Jornada=TiposJornada.Mañana},newCurso{Nombre="301",Jornada=TiposJornada.Mañana},newCurso{Nombre="401",Jornada=TiposJornada.Tarde},newCurso{Nombre="501",Jornada=TiposJornada.Tarde}};asignarAlumnos();}privatevoidasignarAlumnos(){foreach(var curso inEscuela.Cursos){var random =newRandom().Next(5,25); curso.Alumnos=CrearAlumnos(random);foreach(var al in curso.Alumnos){ al.Curso= curso;}}}
Muy bueno!
Para que sirva la función AddRange de las listas es necesario inicializar la lista asi sea vacia con eso después de que recorremos con el for no nos sacará la excepción, a continuación les comparto parte de las líneas de código que me funcionaron para esto:
public Course() =>(this.UniqueId,this.ListStudents) =( Guid.NewGuid().ToString(),new List<Student>());
Se debe tener en cuenta que es necesario generar una sobre carga del constructor de la clase estudiante[student] para que no reciba ningún parametro de entrada para crear alumnos.
publicclassStudent{publicGuidID{ get; set;}public string Name{ get; set;}publicStudent(){}publicStudent(string n)=>(ID,Name)=(Guid.NewGuid(),n);}```
Y en el for para adicionar la lista de estudiantes sólo es necesario añadir el método AddRange
Random rnd = new Random();
foreach(var course in school.courses){ int len = rnd.Next(5,20); course.ListStudents.AddRange(initStudents(len));
}```
Este curso es máginifico a nivel de conocimiento y la forma en que se imparte!
La unica retroalimentación que puedo darle, es que hubiera sido mucho mejor si desde el principio hubieran estructurado todo en un diagrama UML, así los estudiantes sabríamos a donde estamos yendo y con que relaciones tenemos que contar, pienso que la diagramación UML es una parte fundamental de todo desarrollo!
Estoy de acuerdo con tu comentario, en que desde un principio se fije un objetivo, para saber que camino debemos recorrer, que clases vamos a construir etc
la lista alumnos me aparece vacía
Claro porque aún no retorna la ejecución de la función GenerarAlumnosAlAzarm, dale un step in y veras como se llena tu Lista Alumnos.
llegue hasta esta clase, quede super perdido , tengo bases de programación pero hay bastantes cosas nuevas , descansar un rato y retomar de a poco
Gracias, muy buena clase, sólo veo un par de observaciones.
En el método carga CargarAlumnos, se quiere intenta tomar "Aleatoriamente" la cantidad enviada en
CargarAlumnos(int cantidad).
Tal cual está el ejemplo, funciona, pero porque en cada iteración de cursos donde se llama a CargarAlumnos, se crean cada vez los 391 alumnos, por eso hay Guids diferentes siempre, los cuales se ordenan nuevamente en cada ciclo y no se va a repetir en nuestro Take().
El problema es la misma solución, en un ejemplo practico no se debería de crear un conjunto de datos "Grande" cada vez, porque supongamos que es una llamada a un servicio o BD se va a repetir la consulta siempre, eso a parte de que va a consumir el recurso externo innecesariamente nos va a consumir memoria y tiempo de ejecución de más.
Por lo cual debería de estar separada la creación del conjunto de datos una sola vez y el take aleatorio manejarlo con aleatorios que tomen fragmentos de la única lista original para que realmente no se repitan.
Es decir el error original es que se está "asegurando" un set aleatorio en el Guid pero no en las combinaciones generadas.
Otra nota es que también no me permitía meter la lista de asignaturas a cada curso aquí:
En esta clase iba a todo gas. Parece que ya le urgía acabar el curso 🤭
Pero vamos 10/10
Siempre hay algo nuevo que aprender, he aprendido bastante hasta este punto, a pesar de usar C# desde hace varios años. :D haha
Como todos los lenguajes tienen su complejidad, pero estoy aprendiendo bien aunque un video de 15 minutos para mi se convierta en una hora estoy aprendiendo mucho y en especializarme en este lenguaje, profe Carlos Ruiz es excelente
Como nota tuve un problema al agregar listaAsignaturas a curso.Asignaturas en el métido CargarAsignaturas de la forma
var listaAsignaturas =[...codigo...];Curso.Asignaturas.AddRange(listaAsignaturas)
Pero metí la lista sin problemas con:
var listaAsignaturas =[...codigo...];curso.Asignaturas= listaAsignaturas
M sale este error.
Probe copiar los recursos compartidos de platzi(oseha del profe). pero nada
Exception has occurred:CLR/System.NotImplementedExceptionExcepción no controlada del tipo 'System.NotImplementedException' en Etapa1.dll:'The method or operation is not implemented.' en CoreEscuela.EscuelaEngine.CargarAlumnos() en F:\Platzi\DesarrolloAplicacionesASP.net\FundamentosCsharp_NetCore\Etapa4\App\EscuelaEngine.cs: línea 35 en CoreEscuela.EscuelaEngine.inicializar() en F:\Platzi\DesarrolloAplicacionesASP.net\FundamentosCsharp_NetCore\Etapa4\App\EscuelaEngine.cs: línea 18 en CoreEscuela.Program.Main(String[] args) en F:\Platzi\DesarrolloAplicacionesASP.net\FundamentosCsharp_NetCore\Etapa4\Program.cs: línea 14
Hola, este error sale cuando se genera un método automáticamente y no se la da una implementación (no se le dice que hacer). Por default, el IDE pone la siguiente instrucción dentro del método:
Por eso al momento de ejecución, tu programa llega a este punto y ocurre la excepción.
Es un mecanismo del IDE como para decirle al programdor "hey! Creaste este método pero no lo has implementado, haz algo".
Para solucionar este error basta con que le des una implementación al método y listo :).
Vengo de otro lenguaje orientado a objetos y quería explorar el mundo C# pero en ocasiones se me hace un poco enredado y mas al reacomodar código, se borran cosas y se cambian por otras que es cierto queda mejor pero lo que estaba antes también es útil. Es mejor explicar una sola forma y dejarla todo el curso porque se enreda uno mas. Pero resalto que la lógica y el conocimiento del profesor es muy bueno.