Partage
  • Partager sur Facebook
  • Partager sur Twitter

Afficher un objet contenant des listes

    11 mai 2019 à 18:58:54

    bonjour tout le monde , je travail sur un petit programme WPF dans le cadre de mes études, je débute tout juste en c#

    voici mon problème , j'ai un objet de type Recette , qui contient un nom , une difficulté , une liste d'ustensile , d'étapes , d'ingredients... (voir ci dessous)

    afin de tester mon programme j'aimerais pouvoir afficher tout le contenu de celui-ci , j'ai donc redéfini la methode toString dans cette classe et toutes les autres que celle ci contient 

    je vous mets mon test aussi

    je fais donc WriteLine(objet) , tout s'affiche conformément au toString mais pas les differentes listes , (j'obtient un mesage : : System.Collections.Generic.List`1[projet.objet])

    donc si quelqu'un saurait comment faire pour que je puisse tester , ca serait sympa , (en attendant j'ai fais un foreach)

    classe recette:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Pamarmiton
    {
        public class Recette : IEquatable<Recette>
        {
            public string Nom { get; set; }
            public int Difficulte { get; set; }
            private List<string> etape = new List<string>();
            private List<Ingredient> ingredient = new List<Ingredient>();
            private List<Ustensile> ustensile = new List<Ustensile>();
            private LinkedList<Avis> avis = new LinkedList<Avis>();
            public bool EtatAvis { get; set; }
    
            public Recette(string nom, int difficulte, List<string> etape, List<Ustensile> ustensile, List<Ingredient> ingredient)
            {
                Difficulte = difficulte;
                Nom = nom;
                this.etape = etape;
                this.ingredient = ingredient;
                this.ustensile = ustensile;
    
            }
    
            public Recette(string nom, int difficulte)
            {
                this.Nom = nom;
                Difficulte = difficulte;
            }
    
            public void AjouterIngredient(Ingredient i)
            {
                ingredient.Add(i);
            }
    
            public void AjouterEtape(string etape, int numero)
            {
                etape.Insert(numero - 1, etape);
            }
    
            public void SupprimerEtape(int numero)
            {
                etape.RemoveAt(numero - 1);
            }
    
    
            public void EcrireAvis(Avis a)
            {
                if (EtatAvis)
                    throw new AccessViolationException("Attention , un avis a déjà été déposé");
                avis.AddFirst(a);
                EtatAvis = true;
            }
      
    
            public override bool Equals(object obj)
            {
                if (obj == null) return false; ;
                if (obj == this) return true;
                if (obj.GetType() != GetType()) return false;
                return Equals(obj as Recette);
                
            }
    
            public override int GetHashCode()
            {
                return Nom.GetHashCode();
            }
    
            public bool Equals(Recette recette)
            {
                return recette != null &&
                       Nom == recette.Nom;
            }
    
            public override string ToString()
            {
                return $"nom : {Nom}, difficulte : {Difficulte}, étapes : {etape}, ingrédients : {ingredient}, ustensiles : {ustensile}, avis: {avis}, etat de l'avis : {EtatAvis} ";
           }
        }
    }
    

    classe test: 

    using Pamarmiton;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                List<string> l1etape = new List<string>();
                l1etape.Add("mettre le beurre");
                l1etape.Add("battre les blancs en neige");
                l1etape.Add("faire coucou a la populasse");
    
                List<Ustensile> l1ustensile = new List<Ustensile>();
                l1ustensile.Add(new Ustensile("saladier",2));
                Ustensile u2 = new Ustensile("fouet", 1);
                l1ustensile.Add(u2);
    
                List<Ingredient> l1ingredient = new List<Ingredient>();
                l1ingredient.Add(new Ingredient("oeufs de cailles",new Quantite(502,20, Unite.KG)));
                l1ingredient.Add(new Ingredient("ballon d'or", new Quantite(18,4,Unite.G)));
    
    
    
    
                Recette r1 = new Recette("gateau aux pommes", 2, l1etape,l1ustensile,l1ingredient);
                Console.WriteLine(r1);
                foreach (Ustensile us in r1.ustensile)
                {
                    Console.WriteLine(us);
                }
                foreach (Ingredient us in r1.ingredient)
                {
                    Console.WriteLine(us);
                }
            }
        }
    }
    

    merci :)


    • Partager sur Facebook
    • Partager sur Twitter
      11 mai 2019 à 19:28:55

      Salut,

      Je débute en C# mais j'imagine que le problème revient au même que pour afficher un objet sans réécrire la méthode toString. Tu cherches à afficher une instance de la classe List.

      Donc ce que je ferai : construire une chaîne à partir d'une boucle parcourant chaque propriété qui est une List, et coller cette chaîne dans le return.

      • Partager sur Facebook
      • Partager sur Twitter
        11 mai 2019 à 19:45:29

        Salut 

        Merci de prendre le temps de me repondre :)

        Il faudrait que je fasse un for ou for each dans le return du toString ? J'avais pense a faire mais je voyais mal comment faire 

        • Partager sur Facebook
        • Partager sur Twitter
          12 mai 2019 à 0:53:04

          Un foreach sur tes objets de type List, qui crée une chaîne formatée comme tu le souhaites, par exemple :

          string chaîne;

          foreach (Ustensile ustensile in this.ustensile)

          {

               chaîne += ustensile.Nom + ", ";

          }

          ...........

          return $"Blablabla, ustensiles : {chaîne}, blablabla...";

          • Partager sur Facebook
          • Partager sur Twitter
            12 mai 2019 à 14:00:21

            Merci ,

            j'y ai pas touché depuis hier , je m'y remets et je vais faire comme ça :)


            -
            Edité par KillianDherment 12 mai 2019 à 14:01:20

            • Partager sur Facebook
            • Partager sur Twitter
              12 mai 2019 à 15:40:05

              D'ailleurs une toute petite note à ce propos : les listes étant prévues pour contenir plusieurs objets, je les nomme toujours au pluriel. Ça évite surtout ce genre de confusions (cf mon code ci-dessus) :

              foreach (Ustensile ustensile in this.ustensile)

              {

                   chaîne += ustensile.Nom + ", ";

              }

              On peut éventuellement confondre la variable membre avec la variable qui n'a été créé que pour représenter un élément de la liste. Là ça va c'est un tout petit bout de code et c'est dans une boucle où tu ne réutilises pas la propriété ustensile, mais perso je l'aurais nomméee au pluriel :

              List<Ustensile> ustensiles = new List<Ustensile>();

              D'ailleurs l'autre possibilité plutôt que de passer par une boucle foreach dans ta fonction toString(), c'est de définir une propriété (plutôt qu'une variable) Ustensiles de type List<Ustensile> avec un setter par défaut, et un getter dans lequel tu places ta boucle foreach qui crée la chaîne, et tu retournes cette chaîne. De ce fait ta fonction toString comme tu l'avais écrite est censée afficher cette chaîne. Je ne suis pas sur mon PC donc je n'ai pas testé, mais à voir 🙂

              -
              Edité par galactose 12 mai 2019 à 15:44:44

              • Partager sur Facebook
              • Partager sur Twitter
                13 mai 2019 à 16:09:10

                >les listes étant prévues pour contenir plusieurs objets, je les nomme toujours au pluriel

                Non, ça peut être vide ou avec un seul élément.

                Les nommer avec un "s" à la fin, c'est assez moyen car peu visible pour une information aussi importante.

                Une Collection/List/etc... devrait commencer par un marqueur/préfixe qui indique son caractère de collection. (l_..., listN...,etc...)

                >la variable membre

                C'est un champ.

                Les dernières phrases de @galactose sont peu claires, je trouve.

                Pour un champ ustensilList de type List<Ustensil> etc...:

                public static string ListToString<T>(Enumerable<T> list)
                {
                    string ret = "["
                    int index = 0;
                
                    for(var e in list)
                    {
                        if(index>0) ret += ", ";
                        ret += "{" + (e == null ? "null" : e.toString() ) + "}";
                        index++;
                    }
                
                    return ret + "]"
                }
                
                public override string ToString()
                {
                    var ingredients = ListToString(listIngredient);
                    var ustensiles = ListToString(listUstensil);
                    var etapes = ListToString(listEtape);
                    var avis = ListToString(listAvis);
                
                    return $"nom : {Nom}, difficulte : {Difficulte}, étapes : {etapes}, ingrédients : {ingredients}, ustensiles : {ustensiles}, avis: {avis}, etat de l'avis : {EtatAvis} ";
                }



                • Partager sur Facebook
                • Partager sur Twitter
                Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                  14 mai 2019 à 15:29:56

                  Si l'affichage de ton ToString met System.Collections.Generic.List`1[projet.objet] pour les ingrédients, c'est tout simplement car la partie ingrédients : {ingredient} fait appel... à la méthode ToString de l'objet List<Ingrédients>.

                  Par défaut cette méthode va retourner un équivalent en chaine de caractère si c'est un type connu du système (string, int, date...), mais dans le cas d'objet perso, il ne sait pas quoi faire et retourne donc le type. Même si tu boucle sur ta liste et que tu fait ToString, tu va te retrouver avec le type "Ingédients" qui s'affiche.

                  Il suffit simplement de surcharger la méthode ToString de ces objets là aussi pour que ça fonctionne, sans passer par des méthode perso.

                  Exemple : 

                  using System.Collections.Generic;
                  
                  namespace ConsoleApp1
                  {
                      class A
                      {
                          public string Nom { get; set; }
                  
                          public string Prenom { get; set; }
                  
                          public List<B> listB { get; set; }
                  
                          public override string ToString()
                          {
                              string retour = Nom + "_" + Prenom + "\r\n";
                              foreach(B b in listB)
                              {
                                  retour += b.ToString() +"\r\n";
                              }
                              return retour;
                          }
                      }
                  }
                  
                  namespace ConsoleApp1
                  {
                      public class B
                      {
                          public string Libelle { get; set; }
                  
                          public string Code { get; set; }
                  
                          public override string ToString()
                          {
                              return Code + ":" + Libelle;
                          }
                      }
                  }
                  
                  using System;
                  using System.Collections.Generic;
                  
                  namespace ConsoleApp1
                  {
                      class Program
                      {
                          static void Main(string[] args)
                          {
                              A a = new A() { Nom = "toto", Prenom = "tata", listB = new List<B>() { new B() { Code = "AZE", Libelle = "azerty" }, new B() { Code = "QWE", Libelle = "qwerty" } } };
                              Console.WriteLine(a.ToString());
                              Console.Read();
                          }
                      }
                  }
                  

                  la console m'affiche : 





                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 mai 2019 à 17:29:44

                    On est d'accord qu'il ne faut jamais s’enquiquiner avec ces trucs car les framework de log et de sérialisation font tous ces machins automatiquement. ;)
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

                    Afficher un objet contenant des listes

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown