Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2017
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : avril 2017
    Messages : 42
    Points : 38
    Points
    38

    Par défaut Attributs Objet : Récursivité

    Bonjour,

    J'ai un objet system possédant plusieurs attributs et j'aimerais parcourir ses attributs pour récupérer ceux que je souhaite tout en construisant un string (qui sera le "path" de l'objet).

    Voici ma classe CmbdSystem:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
     
    public class CmbdSystem
        {
            public CmbdSystem() 
            {
                mbdTree = null;
                inports = new List<CmbdInport>();
                outports = new List<CmbdOutport>();
                triggerports = new List<CmbdTriggerPort>();
                subsystems = new List<CmbdSubSystem>();
            }
     
            public string mbdTree { get; set; }
            public List<CmbdInport> inports { get; set; }
            public List<CmbdOutport> outports { get; set; }
            public List<CmbdTriggerPort> triggerports { get; set; }
            public List<CmbdSubSystem> subsystems { get; set; }
     
            private static CmbdSystem FindSystem(CmbdSubSystem subSystem)
            {
                return subSystem.system;
            }   
        }
    Et ma classe CmbdSubSystem :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     public class CmbdSubSystem
        {
            public CmbdSubSystem(string name, CmbdSystem system) 
            { 
                this.name = name;
                this.system = system;
            }
     
            public string name { get; set; }
     
            public CmbdSystem system { get; set; }
        }
    un objet system peut ainsi posséder des subsystems qui eux même possèdent un système et ainsi de suite...(sous forme d'arbre).

    A l'aide d'une méthode je parviens à récupérer les systèmes que je souhaite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public static List<CmbdSystem> GetMbd(CmbdSystem system, String mbd, List<string> mbd_tree) 
            {
                foreach (CmbdSubSystem sub in system.subsystems)
                { 
                    tree += "//"+ sub.name;
                    if (sub.name == mbd)
                    {
                        Console.WriteLine("found");
                        //tree += sub.name;
                        systems.Add(sub.system);
                        mbd_tree.Add(tree);// ajouter le path à une liste string à chaque fois qu'un sous système porte le nom du mbd
                        tree = null;
                    }
                    else 
                    {
                        CmbdSystem system_temp = FindSystem(sub);
                        GetMbd(system_temp, mbd, mbd_tree);
     
                    }
     
                }
                return systems;
            }
            public static CmbdSystem FindSystem(CmbdSubSystem subSystem) 
            {
                return subSystem.system;
            }
    Cette méthode fonctionne à moitié car je n'arrive pas à récupérer un path correct pour chaque nom de mbd trouvé.
    Par exemple pour mbd = "susbsystem_1".
    Je voudrais que mon path est la forme suivante : subsystem_x//subsystem_xx//susbsystem_1 par exemple.

    Merci.

  2. #2
    Membre habitué Avatar de EliXirr
    Homme Profil pro
    Développeur informatique
    Inscrit en
    avril 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2013
    Messages : 59
    Points : 145
    Points
    145

    Par défaut

    De ce que je comprends de ton pb tu as une souci dans ton algorithme. C'est pas méchant.

    Je t'invite a revoir ton diagramme de classe afin d'avoir une vision d'ensemble puis de déroulé ton algorithme a la main calmement. Tu devrais voir ou se trouve ton erreur rapidement.

    If faut toujours rester zen lorsque l'on manipule des fonctions recursives mais le bon coté des choses c'est que lorsque ça marche c'est super stable

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2017
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : avril 2017
    Messages : 42
    Points : 38
    Points
    38

    Par défaut

    Bonjour,

    effectivement il ne manquait que 2-3 changement.

    j'ai ce que souhaite.
    Merci

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2017
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : avril 2017
    Messages : 42
    Points : 38
    Points
    38

    Par défaut

    Bonsoir

    Je ré-ouvre le sujet car mon résultat n'est finalement pas fonctionnel.

    Voici le fichier xml sur lequel je bosse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    <?xml version="1.0" encoding="utf-8"?>
    <ModelInformation Version="0.9">
       <Model>
          <System>
             <Block BlockType="SubSystem" Name="SubSysteme1">
                <P Name="tag">xx</P>
                <P Name="Position">xx</P>
                <System>
                   <P Name="source">xx</P>
                   <Block BlockType="Inport" Name="Entree_14">
                      <P Name="Position"></P>
                   </Block> 
                   <Block BlockType="Inport" Name="Entree_2">
                      <P Name="Position">xx</P>
                   </Block>
                   <Block BlockType="SubSystem" Name="SubSysteme1.01">
                      <P Name="tag">xx</P>
                      <P Name="Position">xx</P>
                      <System>
                         <P Name="source">xx</P>
                         <Block BlockType="Inport" Name="XXX_I">
                            <P Name="Position"></P> 
                         </Block>
                         <Block BlockType="Outport" Name="XXX_O">
                            <P Name="Position">xx</P>
                         </Block>
                         <Block BlockType="SubSystem" Name="SubSysteme1.01.1">
                            <System>
                               <P Name="source">xx</P>
                               <Block BlockType="Inport" Name="OO">
                                  <P Name="Position"></P> 
                               </Block>
                               <Block BlockType="Outport" Name="O">
                                  <P Name="Position">xx</P>
                               </Block>
                            </System>   
                         </Block>
                         <Block BlockType="TriggerPort" Name="EV_xx">
                            <P Name="Position">xx</P>
                         </Block>
                      </System>
                   </Block>
                </System>  
             </Block>
             <Block BlockType="SubSystem" Name="SubSysteme1.01">
                <System>
                   <P Name="source">xx</P>
                   <Block BlockType="Inport" Name="OO">
                      <P Name="Position"></P> 
                   </Block>
                   <Block BlockType="Outport" Name="O">
                      <P Name="Position">xx</P>
                   </Block>
                </System>   
             </Block>
          </System>
       </Model>
       <Grapic>
          <P/>
          <P/>  
       </Grapic>   
    </ModelInformation>
    et voici la méthode un peu modifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public static List<CmbdSystem> GetMbd(CmbdSystem system, String mbd, List<string> mbd_tree) 
            {
              // mbd="SubSysteme1.01.1"
                int size = tree.Length;
                foreach (CmbdSubSystem sub in system.subsystems)
                {   
                    tree += "//" + sub.name;
                    if (sub.name == mbd)
                    {
                       // Console.WriteLine("found");
                        //tree += "//" + sub.name;
                        systems.Add(sub.system);
                        mbd_tree.Add(tree);
                        //tree = null;
                    }
                    if (sub.system.subsystems.Count > 0) // if sub is not the last leaf
                    {
                        CmbdSystem system_temp = FindSystem(sub);
                        GetMbd(system_temp, mbd, mbd_tree);
                    }
     
                }
                tree = tree.Remove(size);
                return systems;
            }
    Alors j'obtiens bien deux chaînes de caractères :
    Nom : Capture.PNG
Affichages : 42
Taille : 3,6 Ko

    Cependant comme vous pouvez le voir au moment de revenir au plus haut niveau, le "SubSysteme1" n'est pas effacé de la chaîne pour le deuxième sélectionné.

    Je ne vois pas comment m'en sortir niveau algo.

Discussions similaires

  1. Extraire d'un fichier XML un attribut objet
    Par K-you dans le forum Boost
    Réponses: 2
    Dernier message: 27/04/2010, 13h11
  2. Accès indirect attribut objet
    Par barnoufal dans le forum Ruby
    Réponses: 3
    Dernier message: 26/05/2008, 10h13
  3. Lecture d'un attribut-objet
    Par Gtinaut dans le forum Struts 2
    Réponses: 1
    Dernier message: 07/04/2008, 16h41
  4. Display-table : listing d'un attribut-objet
    Par burhud dans le forum Struts 2
    Réponses: 3
    Dernier message: 22/10/2007, 11h38
  5. Réponses: 4
    Dernier message: 18/02/2006, 17h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo