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#

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 113
    Points : 73
    Points
    73
    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 actif
    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
    Points : 253
    Points
    253
    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 régulier
    Inscrit en
    Novembre 2008
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 113
    Points : 73
    Points
    73
    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 : 42
    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
    Points : 39 754
    Points
    39 754
    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 régulier
    Inscrit en
    Novembre 2008
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 113
    Points : 73
    Points
    73
    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 : 42
    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
    Points : 39 754
    Points
    39 754
    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 actif
    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
    Points : 253
    Points
    253
    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

  8. #8
    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 : 42
    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
    Points : 39 754
    Points
    39 754
    Par défaut
    Citation Envoyé par lysiandad Voir le message
    tomlev a seulement omis de definir le "setter" sur la propriété Grades
    C'était intentionnel
    L'erreur était dans le code du constructeur (cf. mon post précédent)

  9. #9
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 113
    Points : 73
    Points
    73
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public List<int> Grades
    {
        get { return _grades; }
        set { _grades = value; }
    }
    en faisant ainsi, le set ajouterait des éléments a la liste?

    ensuite, lorsque je demande comment initialiser une liste lors de sa création, je parle dans le Program.cs . Comment creer une liste en y mettant directement des membres, comme par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var Persons = new List<Person>(("name1",{1,2,3},"name2",{2,3,4});
    sauf que comme ça ça ne fonctionne pas bien évidemment

  10. #10
    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 : 42
    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
    Points : 39 754
    Points
    39 754
    Par défaut
    Citation Envoyé par JerryOne3 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public List<int> Grades
    {
        get { return _grades; }
        set { _grades = value; }
    }
    en faisant ainsi, le set ajouterait des éléments a la liste?
    Non, le set remplacerait la liste. C'est pour ça que je l'avais mise en lecture seule. Si tu regardes dans les classes du framework, la plupart des propriétés de type liste sont en lecture seule (mais on peut ajouter des éléments à la liste elle-même).

    Citation Envoyé par JerryOne3 Voir le message
    ensuite, lorsque je demande comment initialiser une liste lors de sa création, je parle dans le Program.cs . Comment creer une liste en y mettant directement des membres, comme par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var Persons = new List<Person>(("name1",{1,2,3},"name2",{2,3,4});
    sauf que comme ça ça ne fonctionne pas bien évidemment
    Si tu utilises C# 3 (et apparemment c'est le cas) tu peux faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var Persons = new List<Person>
    {
        new Person
        {
            Name = "name1",
            Grades = new List<int> {1, 2, 3}
        },
        new Person
        {
            Name = "name2",
            Grades = new List<int> {2, 3, 4}
        }};
    Mais je ne vois pas trop l'intérêt, parce que en pratique les données ne seront pas codées en dur, tu les récupèreras plutôt dans un fichier ou une base de données.

  11. #11
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 113
    Points : 73
    Points
    73
    Par défaut
    Oui, pour le set c'est bien ce que je pensais. Je comptais pas le mettre de toute façon.

    sinon, pour l'initialisation de la liste, c'était juste pour savoir comment faire théoriquement.

    merci beaucoup pour toutes ces réponses

    Je vais tenter d'avancer dans l'exercice maintenant

    faut il que je mette une balise [RESOLU] ou quelque chose comme ca maintenant que le sujet est... résolu?

  12. #12
    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 : 42
    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
    Points : 39 754
    Points
    39 754
    Par défaut
    Citation Envoyé par JerryOne3 Voir le message
    faut il que je mette une balise [RESOLU] ou quelque chose comme ca maintenant que le sujet est... résolu?
    Oui, c'est le bouton en bas de la page

+ 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