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 :

Parcourir les element d'un flag enum


Sujet :

C#

  1. #1
    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 Parcourir les element d'un flag enum
    Bonjour

    Existe -t-il une maniere directe de parcourir les elements d'un flag enum ?

    La seule solution que j'ai trouvée est un parcours indirect en passant par l'enumeration des elements l'enum

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
         foreach (MonEnum GV in Enum.GetValues(typeof(MonEnum)))
          {
            if ((GV & MaVariableFlagEnum) != 0)
            {
               // A faire
            }
          }
    Est ce la seule methode ?

  2. #2
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    Je ne vois pas d'autre manière. Ou peut-être utiliser un tableau et jouer avec les indices. Ou peut-être un dictionnaire.

    J'ajouterais juste ceci (si ce n'est pas fait):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
         foreach (MonEnum GV in Enum.GetValues(typeof(MonEnum)))
          {
            if ((GV & MaVariableFlagEnum) != 0)
            {
               // A faire
               break;
            }
          }

  3. #3
    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
    Heu ?

    Ajouter quoi ??

    Ou je suis aveugle ou mal réveillé ou tu a simplement recopié mon code tel quel ?

  4. #4
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    J'ai ajouté un break, mais je me rends compte que cette boucle est particulière car elle teste les valeurs différentes de zéro.

    Question : quel serait un exemple d'utilisation de cette boucle ?

  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
    Ah oui

    Ah mais non SURTOUT ne pas faire un break !!

    Un flag enum contient le bitwise des valeurs requises le but de la boucle est d'effectuer le traitement nécessaire pour chaque bit levé dont la valeur est definie dans l'enum (d'ou & : ce ne sont pas les valeurs differentes de zéro que je teste mais les valeurs de bit correspondant a l'enum)

    Une autre maniere moins propre a mon gout est celle ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          string[] V = MaVariableFlagEnum.ToString().ToLower().Replace(" ", "").Split(',');
          for (int i = 0; i < V.Length; i++)
          {
            // a faire
          }

  6. #6
    Membre Expert Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Par défaut
    Bonjour,

    Tu as toujours la solution de faire comme indiqué, mais c'est tout ce que je peux ajouter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        [Flags]
        public enum Toto
        {
            coucou = 1,
            salut = 2,
            bonjour = 4,
            hello = 8,
            hey = 16
        }
    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
    Toto a = (Toto)31;
     
                switch (a)
                {
                    case Toto.coucou:
                        break;
                    case Toto.salut:
                        break;
                    case Toto.bonjour:
                        break;
                    case Toto.hello:
                        break;
                    case Toto.hey:
                        break;
                    case (Toto.bonjour | Toto.coucou | Toto.hello | Toto.hey | Toto.salut):
                        break;
                    default:
                        break;
                }
    //Ou encore différemment
                switch (a)
                {
                    case (Toto)1:
                        break;
                    case (Toto)2:
                        break;
                    case (Toto)3:
                        break;
                    case (Toto)4:
                        break;
                    case (Toto)5:
                        break;
                    case (Toto)31:
                        break;
                    default:
                        break;
                }
    Bon dév

    EDIT : Tu peux aussi passer par le décalage de bits, mais quoi qu'il arrive tu n'as pas les valeurs de façon unitaire, fais toi une fonction qui te récupère l'ensemble des flags.

  7. #7
    Membre Expert Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Par défaut
    Re-Bonjour,

    Je voulais faire la fonction pour le challenge, voici ce que ça donne :

    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
    public static class EnumExtension
        {
            public static List<T> GetFlags<T>(this T uneEnumeration) where T : struct, IConvertible
            {
                if (!typeof(T).IsEnum)
                {
                    throw new InvalidOperationException("Le type doit être une énumération");
                }
                List<T> retour = new List<T>();
                foreach (T item in Enum.GetValues(typeof(T)))
                {
                    if ((Convert.ToUInt64(item) & Convert.ToUInt64(uneEnumeration)) == Convert.ToUInt64(item))
                    {
                        retour.Add(item);
                    }
                }
                return retour;
            }
        }
    et à l'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Toto a = (Toto)31;
    var lesFlags= a.GetFlags();
    // renvoie toutes les valeurs de l'énumération 
     
    a = (Toto)0;
    lesFlags= a.GetFlags();
    // Ne renvoie rien
    Bon week end...

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/01/2014, 11h12
  2. Réponses: 6
    Dernier message: 26/06/2013, 12h16
  3. parcourir les elements d'une page web
    Par yahya.romdhane.ensi dans le forum Général JavaScript
    Réponses: 19
    Dernier message: 11/04/2013, 15h49
  4. Parcourir et afficher les elements d'une liste chainee
    Par student_ dans le forum Débuter
    Réponses: 15
    Dernier message: 22/12/2009, 21h48
  5. Parcourir les elements d'une ligne crée dynamiquement dans un FORM
    Par redabadache3 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/12/2008, 14h30

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