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 :

Vérifier que ma variable contient bien une valeur de ma structure


Sujet :

C#

  1. #1
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut Vérifier que ma variable contient bien une valeur de ma structure
    Bonjour,

    j'utilise la structure pour la première fois parce que j'ai une variable qui ne peux prendre que 6 valeurs (en base je fais un check pour voir si elle est égale à une de ces valeurs).

    donc j'ai ma structure (incomplète encore):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public struct TypeCategorie
            {
               public static const string Secteur = "Secteur";
               public static const string Complexe = "Complexe";
            }
    et ma variable qui prend une de ces valeurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     public string Categorie
            {
                get;
                set
                {
                    if (value == TypeCategorie.Secteur)
                    { Categorie = value; }
                    else
                    { throw new Exception("La catégorie d'exploitation est incorrecte: elle doit correspondre a secteur, complexe..."); }
                }
            }
    je voulais déjà savoir si ce code était correcte et si c'était possible de vérifier si ma variable était bien égale à un des champs de ma structure sans faire la vérification champs par champs.

  2. #2
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Si TypeCategorie était une classe, tu pourrais lui affecter une méthode statique du type
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    public static boolean IsTypeCategorie(String value) { ... }

    Ca serait sans doute plus propre que de tout tester dans ta classe consommatrice.

  3. #3
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    ça revient à faire une vérification champs par champs?
    je voulais savoir s'il existait un moyen de faire ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public string Categorie
            {
                get;
                set
                {
                    if (value == ValueOf(TypeCategorie))
                    { Categorie = value; }
                    else
                    { throw new Exception("La catégorie d'exploitation est incorrecte: elle doit correspondre a secteur, complexe..."); }
                }
            }
    Une fonction déjà toute faite qui permettrait de faire ça?

  4. #4
    Membre confirmé Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Points : 577
    Points
    577
    Par défaut
    Et pourquoi pas une enum ça simplifierait la chose non ?

  5. #5
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Tu pourrais utiliser le mot clé IS si tu construisais tes avec la classe TypeCategorie, mais à mon avis tu les construits avec String...

    (Et ça ferait une utilisation farfelue...)

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    le problème de l’énumération c'est qu'il ne peut pas renvoyer de string ce qui reviendrait à faire un switch derrière pour récupérer la string correspondant a mon enum alors qu'avec la structure je peut directement affecté une string en faisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Exploitation test=new Exploitation();
    test.Categorie = Exploitation.TypeCategorie.Secteur;

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    bon bein on va faire une vérification champs par champs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    private bool IsTypeCategorie(string value)
            {
                bool ok = false;
                if (value == TypeCategorie.Complexe || value == TypeCategorie.Secteur)
                { ok = true; }
     
                return ok;
            }

  8. #8
    Membre confirmé Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Points : 577
    Points
    577
    Par défaut
    un enum peut renvoyer : toString()
    http://msdn.microsoft.com/en-us/library/16c1xs4z.aspx

  9. #9
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Autre option :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public class TypeCategorie
            {
               private static const string Secteur = "Secteur";
               private static const string Complexe = "Complexe";
               private static const List<String> categories = new List<string> { Secteur, Complexe };
     
               private bool IsTypeCategorie(string value)
               {
                   if (categories.contains(value)) {
                          return true;
                   }
                   return false;
               }
            }

  10. #10
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    pour l'enum toString on est obligé de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Enum typeCategorie=TypeCategorie.Complexe;
    String categorie=typeCategorie.ToString();
    et pour la classe ça m'oblige a créer une liste contenant toutes les valeur en plus je voudrais pourvoir faire simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String categorie=TypeCategorie.Complexe;
    on dirait qu'il n'y a pas vraiment de méthode permettant le listing de tout ce qu'une structure contient ce qui m'aurai permis de faire une simple recherche dessus.

  11. #11
    Membre confirmé Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Points : 577
    Points
    577
    Par défaut
    tu veux peut être créer un List<TypeCategorie>, franchement je crois pas que tu es compris ce qu'est une struct par rapport à une class... ça se ressemble beaucoup.
    Enfin moi ce que j'ai compris de ton problème ça donne ça comme solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     enum TypeCategorie {Secteur, Complexe}
    Variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public TypeCategorie Categorie
            {
                get;
                set;            
            }
    public String CategorieString {
                 get{return Categorie.toString()}
    }

  12. #12
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Si, si tu veux y accéder aussi en lecture :

    Code c# : 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
     
    public class TypeCategorie
            {
               private static const string _secteur = "Secteur";
               public static string Secteur {
                     get { return _secteur ; }
               }
     
               private static const string _complexe = "Complexe";
               public static string Complexe {
                     get { return _complexe ; }
               }
     
               private static const List<String> categories = new List<string> { Secteur, Complexe };
     
               private bool IsTypeCategorie(string value)
               {
                   if (categories.contains(value)) {
                          return true;
                   }
                   return false;
               }
            }

    Là tu peux bien faire TypeCategorie.Complexe, et tu peux ne pas parcourir l'ensemble. Je vois difficilement comment faire mieux dans ton cas...

  13. #13
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    Voilà ce que j'ai fais:

    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
     
     
        public class Exploitation : ObjetDomaine
        {
            public string Identifiant { get; set; }
            public string Parent_id { get; set; }
            public string Libelle { get; set; }
            public string Categorie
            {
                get { return Categorie; }
                set
                {
                    if (TypeCategorie.categories.Contains(value))
                    { Categorie = value; }
                    else
                    { throw new Exception("La catégorie d'exploitation est incorrecte: elle doit correspondre à secteur, complexe..."); }
                }
            }
     
     
            public struct TypeCategorie
            {
                public const string Secteur = "Secteur";
                public const string Complexe = "Complexe";
                public const List<string> categories = new List<string> { Secteur, Complexe };
     
            }
     
            public Exploitation() { }
     
        }

  14. #14
    Membre confirmé Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Points : 577
    Points
    577
    Par défaut
    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
     
     
     public class Exploitation : ObjetDomaine
        {
            public enum TypeCategorie {Secteur, Complexe}
            private TypeCategorie  cat;
            public string Identifiant { get; set; }
            public string Parent_id { get; set; }
            public string Libelle { get; set; }
     
            public string Categorie
            {
                get { return cat.ToString(); }
                set
                {
                   cat = (TypeCategorie ) Enum.Parse(typeof(TypeCategorie ), value, true);
                }
            }
     
            public Exploitation() { }
     
        }
    ça enverra une exception (ArgumentException) si la valeur n'est pas possible.

  15. #15
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    merci pour cette seconde solution, je comprends pas pourquoi ils n'ont pas rajouté la possibilité d'énumérer des string et autre ...

  16. #16
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    On parle de ca?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var list = Enum.GetNames(typeof(MonEnum));

  17. #17
    Membre confirmé Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Points : 577
    Points
    577
    Par défaut
    Oui c'est vrai, de base l'enum se converti implicitement en int donc c'est pratique si on manipule des entiers. Et en général en base de données le pk et autre id sont numérique donc ça marche bien.
    Avec les string les enum sont moyennement pratique, c'est un peu tordu.

  18. #18
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Je rajoute égalment que les structures NE SONT PAS FAITES POUR CA
    La seule différence entre une classe et une structure c'est que la première est un type valeur, l'autre un type référence.

  19. #19
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Nathanael Marchand Voir le message
    Je rajoute égalment que les structures NE SONT PAS FAITES POUR CA
    +1000

    Dans le code de l'appli sur laquelle je bosse au bureau il y avait un truc comme ça, j'ai sauté au plafond quand je l'ai vu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        public struct ItemState
        {
            public const int ToBeSaved = 0;
            public const int Saved = 1;
            public const int NotModified = 2;
            public const int Deleted = 3;
            public const int UnSelected = 4;
            public const int Incomplete = 5;
        }
    Ici c'est très clairement un enum qu'il faut utiliser. On peut tester si une valeur appartient à l'enum avec la méthode Enum.IsDefined (ça peut prendre un paramètre une valeur de l'enum, ou le nom d'une valeur de l'enum)

  20. #20
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Citation Envoyé par tomlev Voir le message
    +1000

    Dans le code de l'appli sur laquelle je bosse au bureau il y avait un truc comme ça, j'ai sauté au plafond quand je l'ai vu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        public struct ItemState
        {
            public const int ToBeSaved = 0;
            public const int Saved = 1;
            public const int NotModified = 2;
            public const int Deleted = 3;
            public const int UnSelected = 4;
            public const int Incomplete = 5;
        }
    Ici c'est très clairement un enum qu'il faut utiliser. On peut tester si une valeur appartient à l'enum avec la méthode Enum.IsDefined (ça peut prendre un paramètre une valeur de l'enum, ou le nom d'une valeur de l'enum)
    Surtout qu'en fait, que ca soit une structure ou une classe, ca change strictement rien car aucune instance n'est jamais créée, c'est des membres statiques ou des constantes remplacées au moment de la compilation!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Comment vérifier qu'un textbox contient bien que des chiffres..
    Par thomasmrl dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 22/05/2013, 22h56
  2. vérifier si une requete renvoie bien une valeur
    Par ssisssou dans le forum Langage
    Réponses: 1
    Dernier message: 17/03/2010, 12h32
  3. Réponses: 0
    Dernier message: 15/08/2007, 16h36
  4. Réponses: 1
    Dernier message: 08/08/2007, 18h07
  5. vérifier que l'utilisateur entre bien une heure
    Par youp_db dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/11/2006, 11h15

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