IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

C# Discussion :

une liste dans une liste?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 113
    Par défaut une liste dans une liste?
    bonsoir a tous

    étudiant en informatique débutant en C# sur visual studio 2008, j'ai un problème sur le début d'un exercice, et apres de longues heures après lesquelles il me reste peu de cheveux sur la tete, je vous soumet ma requête :

    je cherche a créer une liste de type Person, la classe Person intégrant un string étant le nom d'un élève, et une liste représentant sa liste de notes.

    je cherche a ce que, lors de la creation de la Person, il y ait des notes differentes. pour ce faire j'ai procédé comme suit :

    la classe Person :
    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
     
    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace targil_6
    {
        class Person
        {
            private string _FirstName;
            public List<int> Grades;
     
            public string FirstName
            {
                get { return _FirstName; }
                set { _FirstName = value; }
            }
     
            Person()
            {
                FirstName = " ";
                Grades = null;
            }
     
            public Person(string name, List<int> grades)
            {
                FirstName = name;
                Grades = grades;
            }
        }
    }

    la classe Program :

    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
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace targil_6
    {
        class Program
        {
            static void Main(string[] args)
            {
                var Persons = new List<Person>();
                var grades = new List<int>();
     
                for (int i = 70; i < 80; i++)
                {
                    grades.Add(i);
                }
     
                for (int j = 0; j < 10; j++)
                {
                    for (int k = 0; k < 10; k++)
                    {
                        grades[k] = grades[k] + 1;
                    }
                    Persons.Add(new Person("Firstname" + j, grades));
                }
     
                foreach (Person item in Persons)
                {
                    Console.WriteLine(item.ToString());
                }
     
                Console.ReadKey();
            }
        }
    }
    J'ai mis dans le ToString l'impression de la première note de chaque Person, afin de vérifier que tout va bien, et lors du writeline, ca donne 80 pour tous les élèves. En debug, on se rend compte que la note des Person change dans ceux qui sont déjà dans la liste de Persons en même temps qu'évolue la liste de notes sensées être celles du suivant a entrer dans la liste de Persons...

    voila, une idée de ce qui cloche ?

    Sinon, petite question en plus, comment initialiser une liste comme celle la lors de sa creation en y integrant immediatement des membres ?

    merci d'avance

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 217
    Par défaut
    Citation Envoyé par JerryOne3 Voir le message
    bonsoir a tous
    [...]voila, une idée de ce qui cloche ?
    Posez vous ces questions :

    1) que signifie (c-à-d : quel est l'effet), à l'exécution du programme, cette ligne en gras souligné ? (essayer de "visualiser mentalement" ce que vous avez en memoire de la machine, à chaque fois que cette ligne est executée) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            public Person(string name, List<int> grades)
            {
                FirstName = name;
                Grades = grades;
            }
    2) idem (1) pour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                for (int j = 0; j < 10; j++)
                {
    // [...][...]
                    Persons.Add(new Person("Firstname" + j, grades));
                }
    3) quelle est la corrélation entre mes questions (1) et (2) ci dessus, vis à vis de votre problème ?

    Enfin (tuyau ), relisez la partie de votre cours qui fait la distinction entre passage par valeur et passage par référence dans un environnement d'exécution (que ce soit la pile ou "le tas"..)

    'HTH

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 113
    Par défaut
    bonjour,

    De ce que je comprends, j'aurais créé une sorte de pointeur vers la liste grades, ce qui fait que celle ci n'existe qu'une fois et que les Grades de tous les membres de la liste Persons pointent vers elle?

    Est il possible de remplir ainsi la liste de chacun des membres de Persons différemment, ou faut il que je rentre manuellement les valeurs ?

    merci de votre aide

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par JerryOne3 Voir le message
    De ce que je comprends, j'aurais créé une sorte de pointeur vers la liste grades, ce qui fait que celle ci n'existe qu'une fois et que les Grades de tous les membres de la liste Persons pointent vers elle?
    C'est ça. List<int> est une classe, donc un type référence. En faisant Grades = grades, on ne copie qu'une référence vers le même objet. Il faut donc créer une nouvelle instance de List<int> pour chaque élève.

    En fait, il vaudrait mieux déclarer Grades comme une propriété en lecture seule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private List<int> _grades;
    public List<int> Grades
    {
        get { return _grades; }
    }
    Et l'initialiser dans le constructeur pour que ça ne soit jamais null :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Person()
    {
        FirstName = " ";
        Grades = new List<int>();
    }

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 113
    Par défaut
    je comprends.

    par contre, lorsque je modifie le code comme vous me l'avez suggéré en mettant Grades en lecture seule et et l'initialisant dans le constructeur, j'obtiens une erreur dans les constructeurs aux lignes d'initialisation de grades :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Property or indexer 'targil_6.Person.Grades' cannot be assigned to -- it is read only
    comment faire ?

    sinon j'ai réussi a régler le probleme d'initialisation des grades en modifiant le Program.cs comme suit :

    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
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace targil_6
    {
        class Program
        {
            static void Main(string[] args)
            {
                var Persons = new List<Person>();
    
                for (int j = 0; j < 10; j++)
                {
                    var grades = new List<int>();
    
                    for (int i = 70; i < 80; i++)
                    {
                        grades.Add(i);
                    }
                    for (int k = 0; k < 10; k++)
                    {
                        grades[k] = grades[k] + j;
                    }
                    Persons.Add(new Person("Firstname" + j, grades));
                }
    
                foreach (Person item in Persons)
                {
                    Console.WriteLine(item.ToString());
                }
    
                Console.ReadKey();
            }
        }
    }
    Ça fonctionne parfaitement, ça me donne exactement ce que je cherchais, c'est a dire décalé de 1 pour chaque Person.

    est ce une méthode valable ?

    enfin, je repose ma question du début :

    comment initialiser une liste comme celle la lors de sa creation en y integrant immediatement des membres ?

    merci encore

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par JerryOne3 Voir le message
    par contre, lorsque je modifie le code comme vous me l'avez suggéré en mettant Grades en lecture seule et et l'initialisant dans le constructeur, j'obtiens une erreur dans les constructeurs aux lignes d'initialisation de grades
    Erreur d'étourderie de ma part... mets "_grades" à la place de "Grades" dans le constructeur

    Citation Envoyé par JerryOne3 Voir le message
    est ce une méthode valable ?
    Ca me semble correct

    Citation Envoyé par JerryOne3 Voir le message
    comment initialiser une liste comme celle la lors de sa creation en y integrant immediatement des membres ?
    Ben tu peux toujours initialiser le contenu de Grades dans le constructeur de Person. Mais encore faut-il savoir quelles données tu y mets...

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 217
    Par défaut
    Citation Envoyé par JerryOne3 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Property or indexer 'targil_6.Person.Grades' cannot be assigned to -- it is read only
    comment faire ?
    tomlev a seulement omis de definir le "setter" sur la propriété Grades, si vous la voulez en lecture / ecriture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public List<int> Grades
    {
        get { return _grades; }
        set { _grades = value; }
    }
    'HTH

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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