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

Windows Forms Discussion :

[C#] [WinForms] Chercher, effacer dans un ArrayList


Sujet :

Windows Forms

  1. #1
    Membre chevronné
    Avatar de stailer
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2003
    Messages
    1 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 136
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    3
    Par défaut [C#] [WinForms] Chercher, effacer dans un ArrayList
    Bonjour tout le monde,

    Mon problème sur les ArrayList est au niveau de la recherche et de la suppression.

    Par exemple j'ai un ArrayList qui s'appelle ligne
    et j'ai une classe objet qui s'appelle Trace

    Alors pour accèder à chaque ligne je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for (int x = 0 ; x < ligne.Count ; x++)
    {
         Trace mytrace = (Trace)ligne[x];     
    }
    Et à priori ca fonctionne.... Mais voila, comment supprimer un élément sur cette boucle ? car si j'efface un élément de ligne la boucle ne sera plus valide... De plus, y a t - il un moyen de faire une recherche d'un élément précis sans passer par une boucle... j'ai trouvé IComparer
    mais c'est pour trier, pas pour rechercher.

    Voila, merci de votre aide, pour cette question pas facile facile..
    .o0o__St@iLeR__oOo.

    Lead Developer

    ASP.NET MVC - MCP/MCSD ASP.NET
    PHP Zend Framework / PhalconPHP
    Cordova/Xamarin IOS/Android
    Kendo UI - ExtJS - JQwidgets
    SQL Server / MySQL

  2. #2
    Membre habitué
    Avatar de crjo
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Octobre 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 81
    Points : 132
    Points
    132
    Par défaut Re: [C# WinForms] chercher, effacer dans un Arraylist
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    foreach (Trace mytrace in ligne)
    {
      // utiliser l'élément courant
      mytrace.fonctionMembre();
     
      // supprimer l'élément suivant un critère 'MustBeRemoved'
      if (mytrace.MustBeRemoved)  
        ligne.Remove(mytrace);
    }
    J'ai pas l'occasion de tester le code donné, mais je pense que ça devrait fonctionner pour parcourir un ArrayList et supprimer certains éléments.

    A vérifier donc.

    Sinon, pour rechercher un élément dans une liste, intéresse toi à

    ArrayList.IndexOf(Object) et ArrayList.LastIndexOf(Object)

  3. #3
    Membre chevronné
    Avatar de stailer
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2003
    Messages
    1 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 136
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    3
    Par défaut
    salut,

    merci pour ta réponse... Mais à priori le problème est le même.
    Ca enlève bien l'élément de la liste, mais au tour suivant de la boucle, ca devient invalide et j'ai une erreur :

    La collection a été modifiée*; l'opération d'énumération peut ne pas s'exécuter.
    ... En fait cet arraylist stocke des lignes tracées à l'écran. Je voudrais recalculer uniquement les lignes que l'utilisateur a modifié, et pour l'instant la seule solution que j'ai trouvé est de détruire complètement l'arraylist et le reconstruire.
    Alors ca va si il y a 50 lignes... Mais si il y en a 1000...
    Enfin bon, ca c'est juste pour info.
    .o0o__St@iLeR__oOo.

    Lead Developer

    ASP.NET MVC - MCP/MCSD ASP.NET
    PHP Zend Framework / PhalconPHP
    Cordova/Xamarin IOS/Android
    Kendo UI - ExtJS - JQwidgets
    SQL Server / MySQL

  4. #4
    Membre habitué
    Avatar de crjo
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Octobre 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 81
    Points : 132
    Points
    132
    Par défaut
    j'ai pu tester le code suivant :

    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
    int idx;
    ArrayList al = new ArrayList(10);
     
    // crée 10 éléments string dans al : A B C ...
    char c = 'A';
    for (idx=0; idx<15; idx++)
    {
        string str = c.ToString();
        al.Add(str);
        c++;
    }
     
    // supprime l'élément "H". On cherche l'index et on supprime l'élément à cet index
    idx = al.IndexOf("H");
    al.RemoveAt(idx);
     
    // supprime l'élément "D" d'une autre manière, que je déconseille
    for (idx=0; idx<al.Count; idx++)
    {
        string str = (string)al[idx];
     
        if (str == "D")
            al.RemoveAt(idx);
    }
    Ce code fonctionne bien pour moi.

    Mais le coup de la boucle for, c'est très foireux si tu dois faire plusieurs suppressions. Le problème, c'est que lorsque un élément est supprimé, idx va quand même être incrémenté, et donc, l'élément qui suivait ne va pas être traité par le corps de la boucle.

    Pour te convaincre, essaie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for (idx=0; idx<al.Count; idx++)
    {
        string str = (string)al[idx];
     
        if (str == "D" || str == "E")
            al.RemoveAt(idx);
    }
    et tu verras que l'élément "E" n'est pas supprimé.

    Pour éviter cela, tu peux faire ta boucle à l'envers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (idx=al.Count-1; idx>=0; idx--)
    Si tu dois absolument les regarder dans l'ordre croissant, essaie une boucle while

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int idx=0;
    while(true)
    {
        string str = (string)al[idx];
     
        if (str == "D" || str == "E")
        {
            al.RemoveAt(idx);
            continue;  // recommence la boucle sans incrément idx
        }
     
        idx++;
    }

    Alors, c'était ça ?

  5. #5
    Membre chevronné
    Avatar de stailer
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2003
    Messages
    1 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 136
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    3
    Par défaut
    Oooook j'ai compris... Je savais pas qu'il fallait utiliser le IndexOf de cette manière.

    Merci beaucoup pour toutes ces explications, maintenant ca fonctionne impec.

    A+ !
    .o0o__St@iLeR__oOo.

    Lead Developer

    ASP.NET MVC - MCP/MCSD ASP.NET
    PHP Zend Framework / PhalconPHP
    Cordova/Xamarin IOS/Android
    Kendo UI - ExtJS - JQwidgets
    SQL Server / MySQL

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

Discussions similaires

  1. Chercher dans une ArrayList
    Par Wim88 dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 27/04/2014, 16h52
  2. [VB]Problème d'effacement dans une TextBox
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 24/01/2006, 17h55
  3. [Collections]Supprimer des doublons dans une ArrayList
    Par emie31 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 12/12/2005, 15h15
  4. [C#] [WinForms] Les délégués dans la souffrance
    Par stailer dans le forum Windows Forms
    Réponses: 2
    Dernier message: 08/10/2004, 12h32
  5. [JSP][BEAN]Récuperer des Beans dans un ArrayList
    Par Jones dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 30/08/2004, 11h22

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