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 :

[3.5] List<T>.Count - Bug du framework connu ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Par défaut [3.5] List<T>.Count - Bug du framework connu ?
    Bonjour à tous,

    Je viens de détecter un bug qui me parait hallucinant, je vous laisse juger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int countLines = 1;
    foreach (DocLigne line in doc.LstDocLigne)
    {
            // AddLog affiche à l'écran le message précisé en paramètre
            AddLog("Traitement... (ligne " + countLines + " de " + doc.LstDocLigne.Count + ")");
     
            // traitement sur la ligne, QUI NE MODIFIE PAS LA COLLECTION
     
            countLines++;
    }
    En résultat à l'écran, j'ai eu ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // Traitement... (ligne 1 de 21)
    // Traitement... (ligne 2 de 21)
    // ...
    // Traitement... (ligne 21 de 21)
    // Traitement... (ligne 22 de 21)
    // Traitement... (ligne 23 de 21)
    Que faut-il en conclure ? La propriété Count de List<T> n'est pas fiable ? ou ai-je un bug que je n'aurais pas vu ?
    Sachant que la collection parcourue avait bien 23 éléments.

    Merci.

  2. #2
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut

    Il y a certainement un bug que tu n'a pas vu

    2 remarques
    1- La boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (int countlines=0;countlines<doc.LstDocLigne.Count;countlines++)
    {
      AddLog(String.Format("Traitement... (ligne {0} de {1} ",countLines ,doc.LstDocLigne.Count );
    }
    est plus appropriée a ce que tu fais qu'un foreach

    2- J'ai aussi amélioré ta construction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AddLog(String.Format("Traitement... (ligne {0} de {1} ",countLines ,c.LstDocLigne.Count );

  3. #3
    Membre confirmé Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Par défaut
    Merci pour la réponse,

    en fait, l'amélioration que tu proposes me parait pire (sans offenses)
    Si le Count n'est pas fiable, faire une boucle sur l'incrément à la place du foreach va empirer les choses, non? Au moins avec le foreach je suis sur de boucler sur les 23 lignes et pas 21.

    Pour info, j'ai dis une petite erreur, qui a peut être son importance :
    le résultat à l'écran était le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // Traitement... (ligne 1 de 23)
    // Traitement... (ligne 2 de 23)
    // ...
    // Traitement... (ligne 5 de 23)
    // Traitement... (ligne 6 de 21)
    // ...
    // Traitement... (ligne 21 de 21)
    // Traitement... (ligne 22 de 21)
    // Traitement... (ligne 23 de 21)
    J'ai rien trouvé de suspect en relisant mon code (qui a marché très bien pendant 2 mois par ailleurs), même si je n'exclue pas une erreur bien entendue !

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Par défaut
    Tu dois avoir une erreur dans ton code, ça se serait vu depuis longtemps un tel bug (mais on est sûr de rien )

  5. #5
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Mais bien sur que le count est fiable

    Si tu veux envoyer le code de toute ta boucle, je te promet qu'on trouve
    l'erreur !
    En esperant quand meme que ta boucle n'appelle pas trop de methode

    AddLog(" etc..

    Susceptible de modifier ta liste

  6. #6
    Membre confirmé Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Par défaut
    En résumé (je ne peux pas mettre le code réel) ça ressemble fortement à ça, les requêtes paramétrés en moins :

    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
     
    string NoFacture = GetNewFactureNo();
    CreateEnteteFacture(NoFacture);
     
    int countLines = 1;
    foreach (DocLigne line in doc.LstDocLigne)
    {
            // AddLog affiche à l'écran le message précisé en paramètre
            AddLog("Traitement... (ligne " + countLines + " de " + doc.LstDocLigne.Count + ")");
     
           string queryAddFALine = "insert into facture_lines (date, numero, line, article) values ('" doc.Date + "','" + NoFacture + "'," + line.No + ",'" + line.Article "')";
    string queryDelBlLine = "delete from bon_livraison_lines where line=" + line.No + " and numero='" + doc.No + "'";
     
    try
    {
    // SqlFactory est ma classe perso d'exécution de requêtes
    SqlFactory.ExecuteNonQuery(queryDelBLLine);
    SqlFactory.ExecuteNonQuery(queryAddFALine);
     } catch {  }
     
            countLines++;
    }
    Je précise qu'il n'y a pas de binding direct entre mes lignes de bon de livraison supprimé et LstDocLigne (la liste est crée une fois et n'est jamais retouché quelque soit ce qu'il se passe réellement dans le BL de la base de données)

    Voilou voilou

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

Discussions similaires

  1. Bug API Poi connu ?
    Par jadey dans le forum Documents
    Réponses: 4
    Dernier message: 29/05/2009, 14h00
  2. liste deroulante et touche entree bug
    Par lolothom dans le forum IHM
    Réponses: 10
    Dernier message: 09/09/2007, 07h33
  3. [BDE] Liste des bugs
    Par bezot3 dans le forum C++Builder
    Réponses: 2
    Dernier message: 05/01/2005, 17h24
  4. Compter le nombre ligne listée (COUNT) ?
    Par StouffR dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/09/2002, 09h41

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