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 :

foreach element (sauf celui ci please ?)


Sujet :

Windows Forms

  1. #1
    Membre régulier Avatar de maVariable
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Points : 105
    Points
    105
    Par défaut foreach element (sauf celui ci please ?)
    Salut,

    savez vous si il est possible de faire un petit écart sur un foreach classique, et de ne pas tout parcourir. Par exemple commencer le foreach à partir du deuxieme element de la liste, ou encore parcourir tous les élément sauf un en particulier ?
    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach(MaObjet objet in ListeObject except ...)
    {
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach(MaObjet objet in ListeObject from...)
    {
    }
    Je sais que ce n'est pas logique pour un foreach, je passerais par un for ou bien je testerai dans le foreach si ce n'est pas possible autrement, mais bon peut être que...

    merci pour vos lumières
    un tiens vaut pas mieux que zéro tu l'auras pas

  2. #2
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Utilise les mots clés continue / break
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    foreach(MonObjet objet in ListeObjets)
    {
        // Pour passer à l'élément suivant
        if (condition) { continue; }
        // Pour sortir du foreach
        if (condition) { break; }
    }
    Pas de questions techniques par MP

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 220
    Points
    220
    Par défaut
    Tu peux sélectionner les éléments de la list avec une expression Linq et ne faire le foreach que sur les éléments sélectionnés

  4. #4
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Points : 444
    Points
    444
    Par défaut
    Tu peux sélectionner les éléments de la list avec une expression Linq et ne faire le foreach que sur les éléments sélectionnés
    Seulement si tu travaille sur le framework 3.5 minimum

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 250
    Points : 420
    Points
    420
    Par défaut
    salut,
    je suis plutôt d'avis pour la requête Linq.
    Genre tu "select" tout "where" différent de "xxx".

    Si tu veux passer par un foreach sinon, ben si c'est différent de ce que tu veux : if(!ce que tu veux), tu fais ce que tu as à faire.
    Exemple, si dans une liste, si a chaque fois t est différent de 0, il sera égal a 5 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                    foreach (var t in list)
                    {
                        if (t != 0)
                        {
                            t = 5;
                        }
                    }

  6. #6
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    Citation Envoyé par maVariable Voir le message
    savez vous si il est possible de faire un petit écart sur un foreach classique, et de ne pas tout parcourir. Par exemple commencer le foreach à partir du deuxieme element de la liste, ou encore parcourir tous les élément sauf un en particulier ?
    Perso, je partiris direct sur un for, qui ne coutera pas forcement plus cher, et qui ser probablement plus lisible et plus performants (pas de test, vu qu'on pars du second item, contre n tests)

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  7. #7
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 133
    Points : 169
    Points
    169
    Par défaut
    On peut déclarer ListeObject avec l'interface IEnumerable et réécrire la méthode GetEnumerator() en fonction de ses besoins, par exemple avec un filtre qui serait dans ListeObject.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class ListeObject : IEnumerable
    {
        private string[] chaines = new string[] {"un", "deux", "trois"} ;
        private string exclude = "deux" ;
        public IEnumerator GetEnumerator() 
        { 
            foreach (string s in chaines) 
            {
              if (s != exclude)
                 yield return s ;
             }
        } 
    }
    et donc on utiliserait ça de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ListeObject o = new ListeObject();
     
    foreach(string s in o)
    {
        Console.WriteLine(s) ;
    }
    Je précise qu'on est pas obligé d'avoir un foreach dans la méthode GetEnumerator(), ça peut être un for, un while ou même une succession de "yield return".

  8. #8
    Membre régulier Avatar de maVariable
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Points : 105
    Points
    105
    Par défaut
    heyyyy, ma question suscite de l'interet semble-t-il, ca veut dire qu'elle n'est pas si bête

    merci beaucoup pour vos réponses. Le link aurait été une bonne idée, mais je n'y ai pas accès. Le find est dispo, mais je ne connais pas la propriété "name" de mes éléments.

    Le for est effectivement le plus simple, mais à priori les éléments "que je veux" ne sont pas forcément tous à la fin, ou tous au début, bref, le parcours par index me force à faire le test tout de même à chaque fois.. de même que le foreach avec des tests (désolé pour l'exmple 2 qui n'est donc plus valable par rapport à ce que je cherche)

    La solution avec IEnumerable me semble la plus adaptée. Elle correspond aussi à faire un test par variable, mais l'avantage est que la liste retournée contient directement les éléments que je veux. l'avantage ? je peux caster directement dans mon foreach les élément dans le même format. Vu que je vais faire ca un bon nombre de fois, ca semble assez pratique.

    En clair, ma liste est composée d'éléments de type différents (c'est une liste de type ControlCollection, avec des grilles, des boutons, etc...). Avec la méthode de Zartan, je peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach(ObjetDeTypeUn objet in ControlCollection)
    {
       ...
    }
    sans avoir d'erreur de cast...
    bon je vais essayer ca, je vous tiens au courant
    un tiens vaut pas mieux que zéro tu l'auras pas

  9. #9
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Aah, ton besoin est de ne récupérer que les éléments de la liste d'un type donné ? Si t'as pas accès au framework 3.5, tu peux quand même réimplémenter la méthode d'extension OfType :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public IEnumerable<T> ControlsOfType<T>() where T : Control
    {
      foreach(Control c in ControlCollection)
        if (c is T)
          yield return (T)c;
    }
     
    foreach(Button b in ControlsOfType<Button>())
      ...
    ಠ_ಠ

  10. #10
    Membre régulier Avatar de maVariable
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Points : 105
    Points
    105
    Par défaut
    parfait, cette solution me convient très bien.

    Merci beaucoup pour vos réponses
    un tiens vaut pas mieux que zéro tu l'auras pas

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

Discussions similaires

  1. Element suivant dans une boucle "Foreach"
    Par ganguill dans le forum Langage
    Réponses: 16
    Dernier message: 20/05/2010, 09h05
  2. Ouvrir tous les fichiers d'un dossier sauf celui de ma macro?
    Par drthodt dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 29/07/2008, 11h58
  3. [JSTL] Ma boucle c:forEach n´affiche pas tous les elements
    Par makohsarah dans le forum Taglibs
    Réponses: 1
    Dernier message: 10/06/2008, 16h52
  4. Fermer les classeurs excel sauf celui actif
    Par Balian1412 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/10/2006, 10h35

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