Saltar al contenido principal

 none
La lista me repite el ultimo objeto agregado RRS feed

  • Pregunta

  • hola buenas noches, estoy haciendo un abmc entres capas, cuando ingreso alumnos en la lista me muestra el ultimo agregado repectidamente como que me pisa los datos de los otros y en el count me dice bien la cantidad de alumnos que agregue, espero que me puedan ayudar, hoy debo entregar este tabajo funcionando bien

    esto es el main

                                                                                                                                                                                            

    using System;
    using System.Collections.Generic;
    using LibreriaDeAlumnos;
    using System.Text;

    namespace ConsolaDelABMC
    {
        class Program
        {
            static void Main(string[] args)
            {
                int opcion;
                ListaDeAlumnos objlist = new ListaDeAlumnos();
                bool errordenombre, errordeapellido, errordedni, errordefecha, errordelegajo;
                Alumno objalumno = new Alumno();
                do
                {

                    Console.WriteLine("Elija una opción ");
                    Console.WriteLine("");
                    Console.WriteLine("1°)Alta");
                    Console.WriteLine("");
                    Console.WriteLine("2°)Consulta");
                    Console.WriteLine("");
                    Console.WriteLine("3°)Modificación");
                    Console.WriteLine("");
                    Console.WriteLine("4°)Baja");
                    Console.WriteLine("");
                    Console.WriteLine("5°)Salir");
                    opcion = int.Parse (Console.ReadLine());
                    Console.Clear();

                    switch (opcion)
                    {
                        case 1:

                            //do
                            //{
                            Console.WriteLine("Ingresa Nombre del Alumno");
                          /*  errordenombre = objlist.ErrorSoloLetras(*/objalumno.Nombre = Console.ReadLine()/*)*/;

                            //} while (errordenombre) ;


                            //do
                            //{

                                Console.WriteLine("Ingresa Apellido Del Alumno");
                                /*errordeapellido = objlist.ErrorSoloLetras(*/objalumno.Apellido = Console.ReadLine()/*)*/;
                            //} while (errordeapellido);


                            do
                            {
                                try
                                {
                                    Console.WriteLine("Ingresa D.N.I del Alumno");
                                    objalumno.Documento = int.Parse(Console.ReadLine());
                                    errordedni = false;
                                }
                                catch (Exception)
                                {

                                    Console.WriteLine("Error no se puede ingresar letras, ingrese numeros");
                                    errordedni = true;
                                }
                            } while (errordedni);


                            do
                            {
                                try
                                {
                                    Console.WriteLine("Ingresa Fecha De Nacimiento del Alumno en el formato de DD/MM/AA: ");
                                    objalumno.FechaDeNacimiento = DateTime.Parse(Console.ReadLine());
                                    errordefecha = false;
                                }
                                catch (Exception)
                                {

                                    Console.WriteLine("Ingrese bien la Fecha de Nacimiento ");
                                    errordefecha = true;
                                }
                            } while (errordefecha);


                            do
                            {
                                try
                                {
                                    Console.WriteLine("Ingresa Numero De Legajo del Alumno");
                                    objalumno.NumeroDeLegajo = int.Parse(Console.ReadLine());
                                    errordelegajo = false;
                                }
                                catch (Exception)
                                {

                                    Console.WriteLine("Error no se puede ingresar letras, ingrese numeros");
                                    errordelegajo = true;
                                }
                            } while (errordelegajo);
                           objlist.DardedeAlta(objalumno);
                            Console.WriteLine("Alumno Registrado Exitosamente");





                            break;

                            case 2:


                            foreach (Alumno M in objlist.listadealumno)
                            {
                                Console.WriteLine(objalumno.MostrarDatos());



                            }


                            Console.WriteLine("Alumnos Agregados: " + objlist.CantidadDeAlumnos());
                            break;
                        case 3:

                            int dni;
                            do
                            {
                                try
                                {
                                    Console.WriteLine("Ingresa D.N.I del Alumno que desea buscar, para modificar sus datos ");
                                    dni = int.Parse(Console.ReadLine());
                                    errordedni = false;
                                }
                                catch (Exception)
                                {

                                    Console.WriteLine("Error no se puede ingresar letras, ingrese numeros");
                                    errordedni = true;
                                }
                            } while (errordedni);



                            //do
                            //{
                                Console.WriteLine("Ingrese el Nombre que desea modificar");
                                /*errordenombre = objlist.ErrorSoloLetras(*/objalumno.Nombre = Console.ReadLine()/*)*/;
                            objlist.Modificación(objalumno);
                            /*} while (errordenombre)*/
                            ;


                            //do
                            //{
                                Console.WriteLine("Ingrese el Apellido que desea modificar");
                               /* errordeapellido = objlist.ErrorSoloLetras(*/objalumno.Apellido = Console.ReadLine()/*)*/;
                            //} while (errordeapellido);


                            do
                            {
                                try
                                {
                                    Console.WriteLine("Ingrese la Fecha de Nacimiento que desea modificar en el formato de DD/MM/AA: ");
                                    objalumno.FechaDeNacimiento = DateTime.Parse(Console.ReadLine());
                                    errordefecha = false;
                                }
                                catch (Exception)
                                {

                                    Console.WriteLine("Ingrese bien la Fecha de Nacimiento ");
                                    errordefecha = true;
                                }
                            } while (errordefecha);



                            do
                            {
                                try
                                {
                                    Console.WriteLine("Ingrese el Numero de Legajo que desea modificar");
                                    objalumno.NumeroDeLegajo = int.Parse(Console.ReadLine());
                                    errordelegajo = false;
                                }
                                catch (Exception)
                                {

                                    Console.WriteLine("Error no se puede ingresar letras, ingrese numeros");
                                    errordelegajo = true;
                                }
                            } while (errordelegajo);

                            Console.WriteLine("Los Datos del Alumno han sido modificados");
                            break;

                        case 4:

                            do
                            {
                                try
                                {
                                    Console.WriteLine("Ingresa D.N.I del Alumno que desea eliminar ");
                                    dni = int.Parse(Console.ReadLine());
                                    errordedni = false;
                                }
                                catch (Exception)
                                {

                                    Console.WriteLine("Error no se puede ingresar letras, ingrese numeros");
                                    errordedni = true;
                                }
                            } while ( errordedni);


                            Console.WriteLine("Alumno eliminado");
                            objlist.Baja(objalumno);
                            break;

                        case 5:
                            Console.WriteLine("Gracias por utilizar este programa ");
                            break;

                        default:
                            Console.WriteLine("Opción incorrecta");
                            break;
                    }
                    Console.ReadKey();
                    Console.Clear();
                } while (opcion != 5);

            }
        }
    }

    Clase De los Metodos de la lista

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace LibreriaDeAlumnos
    {
        public class ListaDeAlumnos
        {

            //public string respuesta;
            public   List<Alumno> listadealumno = new List<Alumno>();


            public ListaDeAlumnos()
            {
                listadealumno = new List<Alumno>();
            }
            // Alta
            public List<Alumno> AgregarLista()
            {
                return listadealumno;
            }
            public void DardedeAlta(Alumno Al)
            {







                listadealumno.Add(Al);




            }


            public int CantidadDeAlumnos()
            {
                return listadealumno.Count;
            }



            //Consulta 

            //public void Consulta(Alumno c)
            //{
            //    Modificación(c);


                //foreach (Alumno M in listadealumno)
                //{
                //    Console.WriteLine(AlumnoNuevo.MostrarDatos());




                //}


            //}




            // Modificación

            public void Modificación(Alumno AlumnoModi )
            {
                int dni = 0;


                    listadealumno.Find(Alumno => AlumnoModi.Documento == dni);







            }





            // Baja

            public void Baja(Alumno AlumEliminar)
            {
                int dni = 0;

                listadealumno.RemoveAll(AlumEliminar => AlumEliminar.Documento == dni) ;

            }


            //public bool ErrorSoloLetras(string E)
            //{
            //    foreach (Char b in E)
            //    {
            //        if (!Char.IsLetter(b) && !Char.IsSeparator(b))
            //        {
            //            Console.WriteLine("Error, Solo se permiten letras");
            //            return true;
            //        }
            //    }
            //    return false;
            //}
        }

    }

    Aclaro por las dudas que los console.writeline no pueden estar en ninguna clase solo en el main

                                                                                                                                         
    viernes, 15 de noviembre de 2019 4:21

Todas las respuestas

  • Respuesta rápida: mueve esta línea:

     Alumno objalumno = new Alumno();

    para que esté dentro del bucle en lugar de fuera del mismo.

    Explicación más larga: Para entender por qué no te funciona hay que saber algo que es fundamental cuando programas en .NET, y es la diferencia entre un tipo-valor ("value type") y un tipo-referencia ("reference type"). En general, todos los class son tipo-referencia y todos los struct son tipo-valor (lo mismo que los enum y los tipos simples como int). Esto implica que tu "ojjAlumno" es un tipo-referencia.

    Los tipos-referencia no contienen directamente sus datos. Contienen una especie de "puntero" (se llama una "referencia") que apunta a una zona de memoria llamada el Heap en la que realmente se guardan los datos. Cuando copias un tipo-referencia de una variable a otra (de forma directa o indirecta, por ejemplo cuando lo pasas como argumento a un método se está haciendo una de estas copias) no se copian los datos, sino solo la referencia. Por lo tanto, las dos variables que has copiado apuntan a la única copia de los datos que existe en el Heap. Si modificas los datos a través de una de las dos variables, quedan modificados también en la otra.

    Ya deberías estar viendo lo que pasa en tu programa. Antes de entrar en el bucle inicializas objAlumno. Esto asigna espacio en el Heap. Dentro del bucle, le metes valores y lo pasas a la lista usando .Add. A la siguiente vuelta del bucle, le cambias los datos y lo añades a la lista con el Add. Observa que esto solo añade a la lista una copia del puntero, no de los datos. Por lo tanto, los dos registros que has añadido a la lista tienen los mismos datos, y esto se repite en todas las iteraciones del bucle, de forma que la lista tiene varios punteros que todos ellos apuntan a la única copia de los datos que hay en el Heap. Por eso todos los datos de la lista muestran el mismo valor (el último que introdujiste).

    La solución es mover el "new" al interior del bucle. Esa es la instrucción que asigna espacio en el Heap para guardar los datos. De esta manera, cada registro recibe un nuevo puntero (creado por el operador new) que apunta a un nuevo bloque de almacenamiento de datos.

    viernes, 15 de noviembre de 2019 11:59
    Moderador
  • muchisimas gracias hice lo que me dijiste peroo ahora al consultar los datos del alumno en el case 2 me los muestra vacio sin ningun dato de los que agregue
    viernes, 15 de noviembre de 2019 16:02
  • El case 2 hace una llamada a MostrarDatos, que no se ve en ningún sitio del código que has puesto.

    Pero aún así, seguramente tendrás que seguir la ejecución paso a paso con el debugger y ver qué es lo que le llega y qué hace con ello. El programa es tan enrevesado y está el código tan poco estructurado que es dificilísimo seguir la ejecución "a simple vista". Seguro que si lo pasas por un programa de los que calculan la complejidad cognitiva, o incluso la complejidad ciclomática, sale un valor varias veces más grande que el máximo recomendado.

    Afortunadamente dispones del debugger en Visual Studio, que te permite ir avanzando línea por línea examinando el valor de las variables a cada paso hasta localizar dónde está la parte que no funciona como esperabas.

    viernes, 15 de noviembre de 2019 19:31
    Moderador