none
Volver a "menus" previos sin "while" en C# RRS feed

  • Pregunta

  • Buenas, soy nuevo en el foro (por lo cual no puedo adjuntar imágenes aún) y el lenguaje, por lo que supongo que cometeré alguno de los errores que eso suele conllevar.

    Actualmente estoy programando una app simple de consola (algo así como Netflix pero muy pobre y simple) en C# usando Visual Studio para un curso.

    En la misma cada menú para navegar por la misma muestra las opciones posibles de forma numerada, por lo que el usuario ingresa el numero correspondiente de acuerdo a la opción que desea.

    El tema es, esto se termina ramificando en muchos menus distintos, y me pregunto que otrasmaneras hay de volver a esos menus previos,  ya sea al anterior o uno presentado mucho antes. Hasta ahora lo he estado haciendo usando while's y switche's, pero quiero saber si hay alguna manera de hacerlo de forma más eficiente.

    Desde ya, muchas gracias.


    domingo, 14 de octubre de 2018 2:13

Respuestas

  • Hola Pablo Rios:

    Puedes hacer algo similar a esto.

        class MiMenu
        {
            public int nivel {get;set;}
            public int elemento { get; set; }
            public string descripcion { get; set; }
    
            public MiMenu(int nivel, int elemento, string descripcion)
            {
                this.nivel = nivel;
                this.elemento = elemento;
                this.descripcion = descripcion;
            }
    
            
            public String ToString()
            {
                return this.descripcion;
            }
            
        }

    Y luego

      static void Main(string[] args)
            {
                string numero = "";
                int x = -1;
                int nivel = 1;
                List<MiMenu> lista = new List<MiMenu>();
                llenarLista(lista);
                
                do
                {
                        foreach (MiMenu m in lista)
                        {
                            if (m.nivel == nivel)
                                Console.WriteLine(m.ToString());
                        }
                    numero = Console.ReadLine();
                    try
                    {
                        x = Convert.ToInt32(numero);
                    }
                    catch { x = 10; }
    
                    if (x == 1)
                        nivel = nivel - 1;
                    else
                    {
                        if (nivel<3)
                            nivel++;
                    }
    
                }
                while ((nivel >0) ); /*si no has introducido un numero, vuelves a hacer el bucle */
            }
            static void llenarLista(List<MiMenu>lista)
            {
                
                lista.Add(new MiMenu(1, 1, "1.-Salir"));
                lista.Add(new MiMenu(1, 2, "2.-opcion2"));
                lista.Add(new MiMenu(1, 3, "3.-opcion3"));
                lista.Add(new MiMenu(1, 4, "4.-opcion4"));
                lista.Add(new MiMenu(1, 5, "5.-opcion5"));
                lista.Add(new MiMenu(1, 6, "6.-opcion6"));
                lista.Add(new MiMenu(1, 7, "7.-opcion7"));
                lista.Add(new MiMenu(1, 8, "8.-opcion8"));
                lista.Add(new MiMenu(1, 9, "9.-opcion9"));
    
                lista.Add(new MiMenu(2, 1, "1.-Anterior 2-1"));
                lista.Add(new MiMenu(2, 2, "2.-opcion 2-2"));
                lista.Add(new MiMenu(2, 3, "3.-opcion 2-3"));
                lista.Add(new MiMenu(2, 4, "4.-opcion 2-4"));
                lista.Add(new MiMenu(2, 5, "5.-opcion 2-5"));
                lista.Add(new MiMenu(2, 6, "6.-opcion 2-6"));
                lista.Add(new MiMenu(2, 7, "7.-opcion 2-7"));
                lista.Add(new MiMenu(2, 8, "8.-opcion 2-8"));
                lista.Add(new MiMenu(2, 9, "9.-opcion 2-9"));
    
                lista.Add(new MiMenu(3, 1, "1.-Anterior 3-1"));
                lista.Add(new MiMenu(3, 2, "2.-opcion 3-2"));
                lista.Add(new MiMenu(3, 3, "3.-opcion 3-3"));
            }

    Básicamente, creas una coleccion de elementos, que contenga un nivel donde estas, y luego sus elementos numerados.

    Y tienes que iterar dentro de la colección.

    Espero te ayude

    domingo, 14 de octubre de 2018 7:25

Todas las respuestas

  • Hola Pablo Rios:

    Puedes hacer algo similar a esto.

        class MiMenu
        {
            public int nivel {get;set;}
            public int elemento { get; set; }
            public string descripcion { get; set; }
    
            public MiMenu(int nivel, int elemento, string descripcion)
            {
                this.nivel = nivel;
                this.elemento = elemento;
                this.descripcion = descripcion;
            }
    
            
            public String ToString()
            {
                return this.descripcion;
            }
            
        }

    Y luego

      static void Main(string[] args)
            {
                string numero = "";
                int x = -1;
                int nivel = 1;
                List<MiMenu> lista = new List<MiMenu>();
                llenarLista(lista);
                
                do
                {
                        foreach (MiMenu m in lista)
                        {
                            if (m.nivel == nivel)
                                Console.WriteLine(m.ToString());
                        }
                    numero = Console.ReadLine();
                    try
                    {
                        x = Convert.ToInt32(numero);
                    }
                    catch { x = 10; }
    
                    if (x == 1)
                        nivel = nivel - 1;
                    else
                    {
                        if (nivel<3)
                            nivel++;
                    }
    
                }
                while ((nivel >0) ); /*si no has introducido un numero, vuelves a hacer el bucle */
            }
            static void llenarLista(List<MiMenu>lista)
            {
                
                lista.Add(new MiMenu(1, 1, "1.-Salir"));
                lista.Add(new MiMenu(1, 2, "2.-opcion2"));
                lista.Add(new MiMenu(1, 3, "3.-opcion3"));
                lista.Add(new MiMenu(1, 4, "4.-opcion4"));
                lista.Add(new MiMenu(1, 5, "5.-opcion5"));
                lista.Add(new MiMenu(1, 6, "6.-opcion6"));
                lista.Add(new MiMenu(1, 7, "7.-opcion7"));
                lista.Add(new MiMenu(1, 8, "8.-opcion8"));
                lista.Add(new MiMenu(1, 9, "9.-opcion9"));
    
                lista.Add(new MiMenu(2, 1, "1.-Anterior 2-1"));
                lista.Add(new MiMenu(2, 2, "2.-opcion 2-2"));
                lista.Add(new MiMenu(2, 3, "3.-opcion 2-3"));
                lista.Add(new MiMenu(2, 4, "4.-opcion 2-4"));
                lista.Add(new MiMenu(2, 5, "5.-opcion 2-5"));
                lista.Add(new MiMenu(2, 6, "6.-opcion 2-6"));
                lista.Add(new MiMenu(2, 7, "7.-opcion 2-7"));
                lista.Add(new MiMenu(2, 8, "8.-opcion 2-8"));
                lista.Add(new MiMenu(2, 9, "9.-opcion 2-9"));
    
                lista.Add(new MiMenu(3, 1, "1.-Anterior 3-1"));
                lista.Add(new MiMenu(3, 2, "2.-opcion 3-2"));
                lista.Add(new MiMenu(3, 3, "3.-opcion 3-3"));
            }

    Básicamente, creas una coleccion de elementos, que contenga un nivel donde estas, y luego sus elementos numerados.

    Y tienes que iterar dentro de la colección.

    Espero te ayude

    domingo, 14 de octubre de 2018 7:25
  • hola

    >>esto se termina ramificando en muchos menus distintos, y me pregunto que otrasmaneras hay de volver a esos menus previos,

    hasta donde conozco el while lo vas a necesitar ya que un desarrollo en consola ejecuta de fora lineal o sea no hay evento o pantallas que puedas trabajar

    quizas si hay muchos menues podrias modularzarlo un poco usando funciones que separen ese codigo y permitan organizarlo quizas en otro while que trabaje con esa seccion en concreto, podrias usar el break para salir de ese while y que regrese al superior que lo contiene

    los switch entiendo son necesario para la seccion de una accion en concreto, quizas esto se pueda reemplazar si usas un Dictionary<> con la opcion y la accion ha ejecutar, ordenari el codigo

    Como evitar el uso del switch (1/2)

    no es exacto lo que usas pero da una idea como separar las acciones en diferentes implementaciones usando clase he interfaces

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 16 de octubre de 2018 16:17
  • Muchas gracias, aunque respondo tarde me ha resultado muy útil.

    miércoles, 24 de octubre de 2018 21:33