none
Retornar lista en forma de string RRS feed

  • Pregunta

  • Hola, no se como podria resolver una consigna de un ejercicio que encontre para practicar, que hacer que dice asi:

    Desarrollar un metodo que devuelva una lista de datos de personas con el siguiente formato:
    
    "Nombre - Apellido - Fecha de ingreso"
    
    La lista a retornar debe contener los 3 datos juntos en forma de string como lo indica el ejemplo.

    Tengo la clase Persona con esas propiedades, y una clase Administracion con una lista de Persona y ahi es donde quiero hacer el metodo. Lo que no se como se hace es retornar una lista pero que este con esa forma de string, no se si hay una propiedad o estoy entiendiendo mal el ejercicio y hay que retornar un string antes haciendo un foreach de la lista de personas.

    Gracias.

    martes, 9 de octubre de 2018 2:14

Respuestas

  • Una forma elegante de hacerlo es añadir dentro de la clase Persona una sobrecarga del método ToString. Simplemente añades "public override string ToString() {...} " (te lo debe ofrecer automáticamente Visual Studio en cuanto lo empieces a teclear), y dentro pones un return que concatene las tras propiedades y devuelva la cadena resultante.

    Una vez hecho eso, simplemente haces un bucle que recorra todas las personas llamando al método ToString y los resultados los metes en una lista de strings.

    • Propuesto como respuesta Pablo RubioModerator martes, 9 de octubre de 2018 15:18
    • Marcado como respuesta Nacho Sa martes, 9 de octubre de 2018 18:53
    martes, 9 de octubre de 2018 6:31
    Moderador
  • Buenas,

    Si el método es de tipo string, siempre tiene que devolver un string, lo que puedes hacer, es devovler el string como null y evaluarlo fuera :

    public string Saludar()
    {
       string retorno = null;
       //Condicion if que se tiene que cumplir para que devulva valor
       {
           retorno =  "algo"
       }
       return retorno;
    }
    
    
    //==========USO==========
    string saludo = Saludar();
    if(saludo != null)
       //Hago algo con saludo

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub

    Mi Blog


    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    • Propuesto como respuesta Pablo RubioModerator martes, 9 de octubre de 2018 15:18
    • Marcado como respuesta Nacho Sa martes, 9 de octubre de 2018 18:54
    martes, 9 de octubre de 2018 13:11
  • Buenas,

    Claro, en este caso no es un fallo critico, porque PrepararSaludo no cuesta nada, pero si costara tiempo, generarlo dos veces seria un grave error, puedes solucionarlo obteniendo el string primero y evaluando ese string:

    var saludo = cliente1.PrepararSaludo(); //Obtiene el saludo
    if(!string.IsNullOrWhiteSpace(a)) //Evalua si es correcto
    {
        Console.WriteLine(cliente1.PrepararSaludo()); //Si es correcto lo printea
    }
    

    Con esto, solo ejecutas una única vez el método

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub

    Mi Blog


    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    • Marcado como respuesta Nacho Sa martes, 9 de octubre de 2018 21:59
    martes, 9 de octubre de 2018 19:18
  • Buenas, 

    Poder podrías... al final devolverías una tuple y con eso lo tendrías... de todos modos, podrías agruparlos con LinQ, de modo que tengas todos los datos y ese extra, te dejo un ejemplo a ver que te parece:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace Ejemplo
    {
      class Program
      {
        static void Main(string[] args)
        {
          var personas = new List<Persona>();
          personas.Add(new Persona { Id = 1, Nombre = "Pepe", Apellido = "Villuela", Edad = 50 });
          personas.Add(new Persona { Id = 1, Nombre = "Pedro", Apellido = "Andres", Edad = 24 });
          personas.Add(new Persona { Id = 1, Nombre = "Alberto", Apellido = "Muria", Edad = 50 });
    
          //Los agrupo por edad
          var agrupados = personas.GroupBy(x => x.Edad);
    
          foreach (var grupo in agrupados)
          {
            Console.WriteLine($"{grupo.Count()} personas con {grupo.Key} años");
            foreach (var persona in grupo)
              Console.WriteLine($"\t{persona.Nombre} {persona.Apellido}");
          }
    
          Console.Read();
        }
    
        class Persona
        {
          public int Id { get; set; }
          public string Nombre { get; set; }
          public string Apellido { get; set; }
          public int Edad { get; set; }
        }
      }
    }
    

    Ya nos dirás si esta te valdría

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub

    Mi Blog


    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    • Marcado como respuesta Nacho Sa miércoles, 10 de octubre de 2018 20:16
    miércoles, 10 de octubre de 2018 15:15

Todas las respuestas

  • Una forma elegante de hacerlo es añadir dentro de la clase Persona una sobrecarga del método ToString. Simplemente añades "public override string ToString() {...} " (te lo debe ofrecer automáticamente Visual Studio en cuanto lo empieces a teclear), y dentro pones un return que concatene las tras propiedades y devuelva la cadena resultante.

    Una vez hecho eso, simplemente haces un bucle que recorra todas las personas llamando al método ToString y los resultados los metes en una lista de strings.

    • Propuesto como respuesta Pablo RubioModerator martes, 9 de octubre de 2018 15:18
    • Marcado como respuesta Nacho Sa martes, 9 de octubre de 2018 18:53
    martes, 9 de octubre de 2018 6:31
    Moderador
  • Gracias, ahora lo voy a probar! Te hago otra consulta, si tendria un metodo que me tiene que devolver un string por ejemplo, pero necesito que se cumpla una condicion para devolverlo, como haria para que si se cumple la condicion si requiera la devolucion del string y si no se cumple que no sea necesario devolver nada. Algo asi seria:

    public string Saludar()
    {
       //Condicion if que se tiene que cumplir para que devulva valor
       {
           return algo
       }
    }

    Pero si lo hago de esa forma, el return al estar dentro de un if me tira un error, ya que puede no devolver nada.
    martes, 9 de octubre de 2018 12:48
  • Buenas,

    Si el método es de tipo string, siempre tiene que devolver un string, lo que puedes hacer, es devovler el string como null y evaluarlo fuera :

    public string Saludar()
    {
       string retorno = null;
       //Condicion if que se tiene que cumplir para que devulva valor
       {
           retorno =  "algo"
       }
       return retorno;
    }
    
    
    //==========USO==========
    string saludo = Saludar();
    if(saludo != null)
       //Hago algo con saludo

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub

    Mi Blog


    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    • Propuesto como respuesta Pablo RubioModerator martes, 9 de octubre de 2018 15:18
    • Marcado como respuesta Nacho Sa martes, 9 de octubre de 2018 18:54
    martes, 9 de octubre de 2018 13:11
  • Gracias Jorge, me sirvio pero me surgio otra duda, te explico lo que tengo para ser mas claro:

    public string PrepararSaludo()
            {
                string retorno = null;
                if (FechaNacimiento.Day == DateTime.Today.Day && FechaNacimiento.Month == DateTime.Today.Month)
                {
                    retorno = $"¡Muy feliz cumpleaños {Nombre}! Lo saluda Diez distribuidora";
                }
                return retorno;
            }

    Eso tendria en una biblioteca de clases, y dentro del Program de una aplicacion de consola tendria:

    if (cliente1.PrepararSaludo() != null)
                {
                    Console.WriteLine(cliente1.PrepararSaludo());
                }

    Lo que me pasa es que corre el metodo PrepararSaludo dos veces, una para ver si la propeidad es null y otra para mostrar en Consola el saludo. No creo que sea la mejor forma de hacerlo, me recomendarias hacerlo de otra forma? Hay una mejor practica que esta? Porque aunque funcione bien, no creo que sea lo mejor.

    martes, 9 de octubre de 2018 19:02
  • Buenas,

    Claro, en este caso no es un fallo critico, porque PrepararSaludo no cuesta nada, pero si costara tiempo, generarlo dos veces seria un grave error, puedes solucionarlo obteniendo el string primero y evaluando ese string:

    var saludo = cliente1.PrepararSaludo(); //Obtiene el saludo
    if(!string.IsNullOrWhiteSpace(a)) //Evalua si es correcto
    {
        Console.WriteLine(cliente1.PrepararSaludo()); //Si es correcto lo printea
    }
    

    Con esto, solo ejecutas una única vez el método

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub

    Mi Blog


    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    • Marcado como respuesta Nacho Sa martes, 9 de octubre de 2018 21:59
    martes, 9 de octubre de 2018 19:18
  • Hago otra consulta en este mismo tema porque es sobre listas tambien. Si yo tuviera una clase Persona con las propiedades: id, nombre, apellido y edad. Y quisiera hacer un metodo que devuelva una lista de la clase Persona pero unicamente con las propiedades nombre, edad y agregar una que sea cantidad (que seria la cantidad de personas con esa edad), hay alguna forma de crear una List<Persona> pero que unicamente tenga esas dos propiedades (nombre y edad) y agregarle una tercera (cantidad)?

    Gracias.

    miércoles, 10 de octubre de 2018 13:15
  • Buenas, 

    Poder podrías... al final devolverías una tuple y con eso lo tendrías... de todos modos, podrías agruparlos con LinQ, de modo que tengas todos los datos y ese extra, te dejo un ejemplo a ver que te parece:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace Ejemplo
    {
      class Program
      {
        static void Main(string[] args)
        {
          var personas = new List<Persona>();
          personas.Add(new Persona { Id = 1, Nombre = "Pepe", Apellido = "Villuela", Edad = 50 });
          personas.Add(new Persona { Id = 1, Nombre = "Pedro", Apellido = "Andres", Edad = 24 });
          personas.Add(new Persona { Id = 1, Nombre = "Alberto", Apellido = "Muria", Edad = 50 });
    
          //Los agrupo por edad
          var agrupados = personas.GroupBy(x => x.Edad);
    
          foreach (var grupo in agrupados)
          {
            Console.WriteLine($"{grupo.Count()} personas con {grupo.Key} años");
            foreach (var persona in grupo)
              Console.WriteLine($"\t{persona.Nombre} {persona.Apellido}");
          }
    
          Console.Read();
        }
    
        class Persona
        {
          public int Id { get; set; }
          public string Nombre { get; set; }
          public string Apellido { get; set; }
          public int Edad { get; set; }
        }
      }
    }
    

    Ya nos dirás si esta te valdría

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub

    Mi Blog


    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    • Marcado como respuesta Nacho Sa miércoles, 10 de octubre de 2018 20:16
    miércoles, 10 de octubre de 2018 15:15