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 :

Problème de List<> [Débutant]


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 19
    Points : 18
    Points
    18
    Par défaut Problème de List<>
    Bonjour,

    J'ai quelques soucis avec un bout de code qui me permet d'aller lire les lignes d'un fichier texte pour ensuite en faire une liste d'objets par ligne.
    Le soucis c'est qu'a chaque passage, l'ajout dans la liste m'ajoute dasn l'indice en cours et touts les précédents. Du coup, je me retrouve avec une liste
    avec le bon nombres d'objets mais ce sont tous les mêmes , c-a-d le dernier.

    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
    public static void LectureFichier(string fichier)
            {
                _listeScoreClassicTest.Clear();
                StreamReader lecture = new StreamReader(fichier+GestionUser._listeUser[frmAccueil.pointeur].Login+".txt",Encoding.GetEncoding("iso-8859-1"));
                string ligneLue = lecture.ReadLine();
     
                while (ligneLue != null)
                {
                    string[] ligne = ligneLue.Split(';');
                    GestionScore score = new GestionScore(ligne[0], ligne[1], ligne[2]);
                    _listeScoreClassicTest.Add(score);
                    ligneLue = lecture.ReadLine();
     
                }
                lecture.Close();
            }
    Si quelqu'un peut me venir en aide ce serait génial. Merci.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Pour moi tu peux te passer de la variable score, et ajouter directement dans la liste:
    Code C# : 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
     
    public static void LectureFichier(string fichier)
            {
                _listeScoreClassicTest.Clear();
                StreamReader lecture = new StreamReader(fichier+GestionUser._listeUser[frmAccueil.pointeur].Login+".txt",Encoding.GetEncoding("iso-8859-1"));
                string ligneLue = lecture.ReadLine();
     
                while (ligneLue != null)
                {
                    string[] ligne = ligneLue.Split(';');
                    _listeScoreClassicTest.Add(new GestionScore(ligne[0], ligne[1], ligne[2]));
                    ligneLue = lecture.ReadLine();
     
                }
                lecture.Close();
            }

    Tatayo.

  3. #3
    Membre chevronné
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 640
    Points : 2 149
    Points
    2 149
    Par défaut
    Bonsoir,

    Ton erreur est typiquement le cas d'un même objet ajouté dans une liste, qui ne contient au final qu'une multitude de référence au même objet.

    Cependant, ça n'a pas l'air d'être le cas dans ton code, l'erreur se situe peut-être ailleurs.

    Peux-tu nous montrer ta classe GestionScore ? Ou autre morceau de code qui intervient dans le processus de lecture / écriture des scores.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 19
    Points : 18
    Points
    18
    Par défaut
    Merci pour vos réponses.

    Alors dans l'ordre. J'ai refactorisé mon code comme tu l'as conseillé et cela ne résous pas le problème. Cependant je ne savais pas que l'on pouvais faire ce genre de raccourci. Merci.

    Concernant PixelJuice, je te fourni la classe et ou je l'utilise. Attention, on rigole, mais on ne se moque pas ^^.

    La classe
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    class GestionScore
        {
            static string _fichierClassicTest = @"fichier\resultats\classicTest\";
            static private string _login, _score, _date;
     
            public static List<GestionScore> _listeScoreClassicTest = new List<GestionScore>();
     
            #region propriétés
            public static string FichierClassicTest
            {
                get { return _fichierClassicTest; }
                set { _fichierClassicTest = value; }
            }
     
            public string Login
            {
                get { return _login; }
                set { _login = value; }
            }
     
            public string Score
            {
                get { return _score; }
                set { _score = value; }
            }
     
            public string Date
            {
                get { return _date; }
                set { _date = value; }
            }
     
            #endregion
     
            public GestionScore(string login, string score, string date)
            {
                _login = login;
                _score = score;
                _date = date;
            }
     
            public GestionScore()
            { 
            
            }
     
            public static void LectureFichier(string fichier)
            {
                _listeScoreClassicTest.Clear();
     
                StreamReader file = new StreamReader(_fichierClassicTest + GestionUser._listeUser[frmAccueil.pointeur].Login + ".txt");
                string ligne = file.ReadLine();
     
                while (ligne != null)
                {
                    string[] line = ligne.Split(';');
                    _listeScoreClassicTest.Add(new GestionScore(line[0], line[1], line[2]));
     
                    ligne = file.ReadLine();
                }
                file.Close();
            }
     
            public static void EcritureFichier(string fichier)
            {
                StreamWriter ecriture = new StreamWriter(fichier + GestionUser._listeUser[frmAccueil.pointeur].Login + ".txt", true,Encoding.GetEncoding("iso-8859-1"));
                ecriture.WriteLine(GestionUser._listeUser[frmAccueil.pointeur].Login + ";" + ClassicTestG._score +"/"+GestionQuestionnaire._ListeQuestionnaireAléatoire.Count+";" + DateTime.Now.ToString());
                ecriture.Close();
                LectureFichier(fichier);
            }
     
        }
    L'utilisation (en paramètre de la méthode ce n'est qu'un string static venant de la même classe contenant le chemin du fichier car je veux réutiliser la methode pour d'autre fichier).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private void UserInterface_Load(object sender, EventArgs e)
            {
                GestionScore.LectureFichier(GestionScore.FichierClassicTest);
                lLbluser.Text = GestionUser._listeUser[frmAccueil.pointeur].Nom + " " + GestionUser._listeUser[frmAccueil.pointeur].Prenom;
                pBProfileImage.Image = Image.FromFile(GestionUser._listeUser[frmAccueil.pointeur].Image);
                AffichageScore(affichageScore);
            }
    La méthode AffichageScore qui va chercher dans ma liste d'objet identique pur les afficher (On ne sait jamais)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private void AffichageScore(string score)
            {
                foreach (GestionScore item in GestionScore._listeScoreClassicTest)
                {
                    score += "Classic Test Score : " + item.Score + " Date : " + item.Date + "\n";
     
                }
                txBActualite.Text = score;
            }
    Voila, je ne sais pas pourquoi cela me donne une liste de même objet (le dernier du fichier) tout en sachant que j'ai une méthode identique pour la lecture d'un autre fichier et que celle-la fonctionne parfaitement.

  5. #5
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    Pour commencer tu peux virer toute la partie static de ton code. Je ne sais pas si ça a un lien avec ton problème mais en l'occurrence ça ne me paraît d'aucune utilité, voire même hasardeux. Pour ta question je ne vois a priori pas d'où ça peut venir ; peut-être ta liste est-elle modifiée de façon inattendue à un autre endroit du programme ?

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    D'après l'aide en ligne de Microsoft, un membre statique est commun à toutes les instances d'une classe.
    Il y a donc de fortes chances que ton problème vienne de là.

    Autre chose qui me "perturbe" dans ton code: ta classe GestionScore contient une liste de GestionScore… Tu comptes faire des appels récursifs ?
    Sinon à mon avis il te faut ici deux classes: une classe Score (login,score,date) et une classe GestionScore (avec la liste des scores, la méthode de chargement…). Une classe, une responsabilité.

    Tatayo.

  7. #7
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par Noxen Voir le message
    Pour commencer tu peux virer toute la partie static de ton code. Je ne sais pas si ça a un lien avec ton problème mais en l'occurrence ça ne me paraît d'aucune utilité, voire même hasardeux.
    Tu n'étais pas loin

    Tes attributs sont static, c'est à dire que c'est-à-dire qu'il s'agit d'attributs de classes, et non d'attributs d'instance. De ce fait, tes attributs _login, etc... n'existe qu'en un seul exemplaire et sont commun à TOUTES tes instances. Supprime le static de la déclaration de tes attributs et cela devrait corriger le problème.

    [edit]grillé par tatayo
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 19
    Points : 18
    Points
    18
    Par défaut
    ... Merci !

    Le problème venait bien de mes attributs static. Je l'ai avais mis en static a un moment donné car je les utilisais dans une methode static que j'ai supprimé par la suite. Quand on y réfléchit, cela tombe sous le sens. Je penses qu'a l'avenir, dans une méthode static de la classe, j'utiliserais les propriétés plutôt que les attributs (si c'est possible).

    Pour répondre a tatayo, Je t'avoue que je ne saisi pas bien ce qu'est un appel récursif (je viens d'aller voir le théorie sur le net). En tout les cas, j'utilise une list static public car je récupère les données de cette liste pour les afficher dans une textBox d'une autre Form. Cela répond peut-être à ta question.

    Si je suis ce que Tatayo préconise, je me retrouverais avec une classe score avec uniquement des attributs et propriétés sans aucune méthode de traitement? Je devrais traiter mes score dans une autres classe? Je demande ça car quand je regarde des classes system, elle ont leur traitement directement a l'interieur. Il y a forcément quelque chose que je ne saisi pas dans le schéma de pensée.

    Encore merci pour tout.

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

Discussions similaires

  1. [MySQL] Problème de liste déroulante dynamique
    Par vincedjs dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 03/03/2006, 16h38
  2. Problème de liste déroulante et js...
    Par Empty_body dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 03/03/2006, 10h44
  3. [MySQL] Problème de listes déroulantes liées avec requêtes sql
    Par richton95 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 21/12/2005, 16h04
  4. Problème avec liste déroulante
    Par Invité dans le forum IHM
    Réponses: 2
    Dernier message: 14/12/2005, 21h04
  5. Problème avec listes liées entre elles et bouton "précé
    Par Oluha dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/08/2005, 15h10

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