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 :

supprimer des éléments selon leur type [Débutant]


Sujet :

C#

  1. #1
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut supprimer des éléments selon leur type
    Bonjour,

    j'ai une collection (de type ControlCollection : ArrangedElementCollection, IList, ICollection, IEnumerable, ICloneable), qui contient tout types d'objets. Je voudrais pouvoir manipuler (pour l'instant supprimer) des éléments de cette collection en fonction de leur type.

    Un exemple concret.
    En fait, cette collection est la collection de controles que possède toute winform. Je voudrais, par exemple, supprimer tous ceux qui sont de type Button.
    Comment faire?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  2. #2
    Membre éprouvé
    Avatar de Gurdil le nain
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 468
    Points : 1 111
    Points
    1 111
    Par défaut
    Tu parcours ta collection et tu switch sur le type de l'objet.

    Par contre, il me semble que tu ne pourras pas directement les supprimer dans ta boucle, il faudra stocker leur index et les supprimer après.

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Gurdil le nain Voir le message
    Tu parcours ta collection et tu switch sur le type de l'objet.
    D'accord, mais comment fait-on ça concrètement?

    Citation Envoyé par Gurdil le nain Voir le message
    Par contre, il me semble que tu ne pourras pas directement les supprimer dans ta boucle, il faudra stocker leur index et les supprimer après.
    C'est ce que je pensais aussi, et j'étais parti sur cette méthode oui.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    salut

    le plus simple,

    Faire une boucle qui regarde tous les éléments présents, et tester si

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(myItem is MonType)
    Et si c'est le cas, ajouter dans une liste de suppression, et ensuite, enlever
    les éléments qui sont présents dans cette liste dans ta liste de controle.

    en effet, dans une boucle, il est plus que déconseillé (voir impossible avec les foreach) de supprimer des éléments pendant leur parcours
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  5. #5
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    genre :

    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
     
    //Options 1 - un peu crade
    			for(int i = 0; i < Controls.Count;i++)
    			{
    				if(Controls[i] is Button)
    				{
    					Controls.RemoveAt(i);
    					i--;
    				}
    			}
     
    			// Options 2
    			List<Control> listc = new List<Control>();			
    			foreach(Control c in this.Controls)
    			{
    				if(c is Button)
    				{
    					listc.Add(c);
    				}
    			}
     
    			foreach(Control c in listc)
    			{
    				Controls.Remove(c);
    			}
    			listc.Clear();
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  6. #6
    Membre éprouvé
    Avatar de Gurdil le nain
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 468
    Points : 1 111
    Points
    1 111
    Par défaut
    Je sais pas si la première solution ne va pas générer une IndexOutOfRangeException. Je sais plus s'il recalcule le Count à chaque tour.

  7. #7
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Okay c'est parfait
    Merci pour votre aide
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  8. #8
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    J'ai testé les 2 solutions ==> Résultat identique !!!

    Le Count est recalculé à chaque fois... donc, si tu supprimes un éléments et que
    tu décrementes de 1, tu reviens à l'élément précédent...

    Mais, personnellement, meme si le code est plus "simple", je n'aime pas du tout cette façon de faire...mais elle fonctionne quand même
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  9. #9
    Membre éprouvé
    Avatar de Gurdil le nain
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 468
    Points : 1 111
    Points
    1 111
    Par défaut
    Citation Envoyé par theMonz31 Voir le message
    J'ai testé les 2 solutions ==> Résultat identique !!!

    Le Count est recalculé à chaque fois... donc, si tu supprimes un éléments et que
    tu décrementes de 1, tu reviens à l'élément précédent...

    Mais, personnellement, meme si le code est plus "simple", je n'aime pas du tout cette façon de faire...mais elle fonctionne quand même
    Ouais normal, j'étais juste plus sur qu'il le recalculait...j'utilise tellement peut souvent les For sur les collections génériques. ^^

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 99
    Points : 122
    Points
    122
    Par défaut
    Commence par la fin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int idx = Controls.Count;
    while (idx-- > 0)
    {
        if (Controls[idx] is CheckBox)
            Controls.RemoveAt(idx);
    }

  11. #11
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Citation Envoyé par theMonz31 Voir le message
    genre :

    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
     
    //Options 1 - un peu crade
    			for(int i = 0; i < Controls.Count;i++)
    			{
    				if(Controls[i] is Button)
    				{
    					Controls.RemoveAt(i);
    					i--;
    				}
    			}
     
    			// Options 2
    			List<Control> listc = new List<Control>();			
    			foreach(Control c in this.Controls)
    			{
    				if(c is Button)
    				{
    					listc.Add(c);
    				}
    			}
     
    			foreach(Control c in listc)
    			{
    				Controls.Remove(c);
    			}
    			listc.Clear();
    j'aurai plutôt fait une boucle décroissante... ce qui en IL donne une boucle while comme ci-dessus
    En informatique, le problème se situe toujours entre le clavier et l'écran !
    Il y a deux chemins entre le clavier et l'écran : Par l'UC et par l'utilisateur.

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

Discussions similaires

  1. parcourir une liste et supprimer des éléments selon une condition
    Par jean-pat dans le forum Général Python
    Réponses: 17
    Dernier message: 17/03/2017, 22h07
  2. Ranger des fichiers selon leur type
    Par Battant dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 17/06/2015, 08h08
  3. supprimer des fichiers selon leur nom
    Par qmike dans le forum VBScript
    Réponses: 3
    Dernier message: 12/06/2012, 09h28
  4. Formatage des Cellules selon leur type dans DGV
    Par ElTchoupi dans le forum Windows Forms
    Réponses: 8
    Dernier message: 18/11/2009, 16h36
  5. [Flash MX] Supprimer des carte selon leurs valeurs
    Par Lenalyon dans le forum Flash
    Réponses: 1
    Dernier message: 01/09/2007, 12h18

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