Donner un enum dans une variable [Résolu]

Messages postés
58
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
17 octobre 2019
- - Dernière réponse : Hamster18
Messages postés
58
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
17 octobre 2019
- 8 juin 2019 à 19:52
Bonjour,

J'essaye de mettre en place un teste de personnalité dans mon application WPF. Pour ça l'utilisateur répond à une série de questions. Les réponses sont sous la forme de radioButton dont je récupère les information dans le code c#. Chaque élément coché crée une Reponse qui s'ajoute dans une ListDeReponse. Et j'utilise cette list dans une méthode résultat qui parcours la liste qui incrémente des compteurs. Je compare ensuite les compteur et je voulait que en fonction du compteur le plus important la variable compteur (qui est un enum) prenne une valeur enum particulière. Sauf que j'ai vérifier avec un point d'arrêt et mon enum ne prend jamais de nouvelle valeur...

Pour illustrer mes propos je post ci dessous mon code.


Merci pour toutes indications.
Cordialement.


Voici le code C# (je l'ai raccourci mais l'idée est la)


            if (SOS_Fantomes.IsChecked == true)
            {
                Reponse = new Reponse(Categ.Horreur);
                ListReponse.Add(Reponse);
            }

            if (Star_Wars.IsChecked == true)
            {

                Reponse = new Reponse(Categ.Fantastique);
                ListReponse.Add(Reponse);
            }

            ListSerieConseiller = TestPersonalite.Resultat(ListReponse);




Classe TestPersonalite ( la ou il y a la le problème)

        BiblioSerie BiblioSerie { get; set; } = new BiblioSerie();
        private List<Serie> listSerieConseiller;



        public List<Serie> Resultat(List<Reponse> list_reponse)
        {
            Categ compteur = Categ.Defaut;


            for (int i = 0; i < list_reponse.Count; i++)
            {
                if (list_reponse[i].RepQuestion == Categ.Anime)
                {
                    cptAnime = cptAnime + 1;
                }
                if (list_reponse[i].RepQuestion == Categ.Aventure)
                {
                    cptAventure = cptAventure + 1;
                }
                if (list_reponse[i].RepQuestion == Categ.Action)
                {
                    cptAction = cptAction + 1;
                }
                if (list_reponse[i].RepQuestion == Categ.Fantastique)
                {
                    cptFantastique = cptFantastique + 1;
                }
                if (list_reponse[i].RepQuestion == Categ.Dramatique)
                {
                    cptDramatique = cptDramatique + 1;
                }
                if (list_reponse[i].RepQuestion == Categ.Thriller)
                {
                    cptThriller = cptThriller + 1;
                }
                if (list_reponse[i].RepQuestion == Categ.Comique)
                {
                    cptComique = cptComique + 1;
                }
                if (list_reponse[i].RepQuestion == Categ.Horreur)
                {
                    cptHorreur = cptHorreur + 1;
                }
                if (list_reponse[i].RepQuestion == Categ.Policier)
                {
                    cptPolicier = cptPolicier + 1;
                }
                if (list_reponse[i].RepQuestion == Categ.Fiction)
                {
                    cptFiction = cptFiction + 1;
                }
            }

            if (cptAction < cptAnime)
            {
                compteur = Categ.Anime;
            }
            if (cptAnime < cptAventure)
            {
                compteur = Categ.Aventure;
            }
            if (cptAventure < cptComique)
            {
                compteur = Categ.Comique;
            }
            if (cptComique < cptDramatique)
            {
                compteur = Categ.Dramatique;
            }
            if (cptDramatique < cptFantastique)
            {
                compteur = Categ.Fantastique;
            }
            if (cptFantastique < cptFiction)
            {
                compteur = Categ.Fiction;
            }
            if (cptFiction < cptHorreur)
            {
                compteur = Categ.Horreur;
            }
            if (cptHorreur < cptPolicier)
            {
                compteur = Categ.Aventure;
            }
            if (cptPolicier < cptThriller)
            {
                compteur = Categ.Thriller;
            }
            else
            {
                compteur = Categ.Action;
            }
            
            listSerieConseiller = BiblioSerie.GenreParticulier(compteur);
            return listSerieConseiller;

        }





Code de mon enum

    public enum Categ
    {
        Defaut = 0,
        Fantastique = 5, 
        Epouvante = 8,
        Action = 2, 
        Anime = 9,
        Aventure = 10,
        Comique = 11,
        Dramatique = 12,
        Fiction = 14,
        Horreur = 15,
        Policier = 16,
        Thriller = 17,
    }

Afficher la suite 

3 réponses

Messages postés
3486
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
22 octobre 2019
915
0
Merci
Bonjour,

Dans ta liste de if(), tu termines par un else... Seulement, ce else n'est relié qu'au dernier if ! Donc à la fin, compteur ne peut valoir que deux choses : Action ou Thriller.
Pour rester dans la logique de ton code, tu devrais plutôt écrire un if() comme les autres :
            if (cptPolicier < cptThriller)
            {
                compteur = Categ.Thriller;
            }
            if (cptThriller < cptAction)
            {
                compteur = Categ.Action;
            }

Par contre, je pense que ton code pourrait être amélioré en utilisant, par exemple, un Dictionary<Categ, int> qui incrémente sa valeur pour le Categ donné, et pour lequel il suffit ensuite de chercher la valeur max.

Xavier
Hamster18
Messages postés
58
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
17 octobre 2019
-
Je n'ai jamais utilisé de Dictionary comment ça s'utilise ?
Commenter la réponse de Reivax962
Messages postés
13856
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 octobre 2019
403
0
Merci
Bonsoir,

Comme je te l'ai déjà écrit, WPF nécessite de bien comprendre la programmation objet, et les pattern MVC et MMVC, et surtout d'avoir une bonne connaissance de C#

Souvent, c'est pas trop mal, tu débutes, y a des erreurs, sinon tu ne viendrais pas, mais c'est globalement correct.

Là on dirait un retour en arrière.


Pourquoi n'as tu pas bindé tes checkBoxs? Tu devrais avoir une classe qui te sorte directement tes résultats.


Et là
            for (int i = 0; i < list_reponse.Count; i++)
            {
                if (list_reponse[i].RepQuestion == Categ.Anime)
                {
                    cptAnime = cptAnime + 1;
                }
                if (list_reponse[i].RepQuestion == Categ.Aventure)
                {
                    cptAventure = cptAventure + 1;
                }
                if (list_reponse[i].RepQuestion == Categ.Action)
                {
                    cptAction = cptAction + 1;
                }
                if (list_reponse[i].RepQuestion == Categ.Fantastique)
                {
                    cptFantastique = cptFantastique + 1;
                }
                if (list_reponse[i].RepQuestion == Categ.Dramatique)
                {
                    cptDramatique = cptDramatique + 1;
                }
                if (list_reponse[i].RepQuestion == Categ.Thriller)
                {
                    cptThriller = cptThriller + 1;
                }
                if (list_reponse[i].RepQuestion == Categ.Comique)
                {
                    cptComique = cptComique + 1;
                }
                if (list_reponse[i].RepQuestion == Categ.Horreur)
                {
                    cptHorreur = cptHorreur + 1;
                }
                if (list_reponse[i].RepQuestion == Categ.Policier)
                {
                    cptPolicier = cptPolicier + 1;
                }
                if (list_reponse[i].RepQuestion == Categ.Fiction)
                {
                    cptFiction = cptFiction + 1;
                }
            }


Un peu moins pire, en lignes de codes et en temps d'exécution.
Utiliser un compteur....
cptAnime = list_reponse.Count(r => r. RepQuestion  == Categ.Anime);
//etc...

Mais bon t'as 50 variables, pour rien au final.

Mieux: faire un groupement
            //liste anonyme pour l'exemple
            var list_reponse = new []
            {
                new { RepQuestion = Categ.Action},
                new { RepQuestion = Categ.Anime},
                new { RepQuestion = Categ.Aventure},
                new { RepQuestion = Categ.Comique},
                new { RepQuestion = Categ.Dramatique},
                new { RepQuestion = Categ.Epouvante},
                new { RepQuestion = Categ.Fantastique},
                new { RepQuestion = Categ.Fiction},
                new { RepQuestion = Categ.Horreur},
                new { RepQuestion = Categ.Policier},
                new { RepQuestion = Categ.Thriller},
                new { RepQuestion = Categ.Action},
                new { RepQuestion = Categ.Action},
                new { RepQuestion = Categ.Anime},
                new { RepQuestion = Categ.Aventure},
                new { RepQuestion = Categ.Comique},
                new { RepQuestion = Categ.Fantastique},
                new { RepQuestion = Categ.Fiction},
                new { RepQuestion = Categ.Thriller},
            }.ToList();

            var groupement = list_reponse.GroupBy(r => r.RepQuestion).ToList();


On voit que dans ma liste, il y a 10 "sortes" de réponses, et que par exemple, il y a 2 Thriller.


Et comme, apparement, tu veux juste savoir lequel à le plus de réponse, un tri par ordre décroissant et on garde le premier, dont on extrait la clé de groupement

Categ reponseMax = groupement.OrderByDescending(x => x.Count()).First().Key;

Dans mon cas, reponseMax vaut Action
Commenter la réponse de Whismeril
Messages postés
13856
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 octobre 2019
403
0
Merci
Bonsoir

l'autre jour, je n'avais pas le temps de te montrer une façon de faire pour binder tes cases à cocher.

J'ai créé une classe, elle se base sur les séries que tu as montré précédemment, à toi d'adapter à ton besoin.
    public class TestACocher : INotifyPropertyChanged
    {
        public TestACocher(Serie LaSerie)
        {
            Titre = LaSerie.Nom;
            Genre = LaSerie.Genre;
        }

        private string titre;
        /// <summary>
        /// Titre
        /// </summary>
        public string Titre
        {
            get { return titre; }
            private set
            {
                if (titre != value)
                {
                    titre = value;
                    GenerePropertyChanged("Titre");
                }
            }
        }

        private Categ genre;
        /// <summary>
        /// Genre
        /// </summary>
        public Categ Genre
        {
            get { return genre; }
            private set
            {
                if (genre != value)
                {
                    genre = value;
                    GenerePropertyChanged("Genre");
                }
            }
        }

        private bool isChecked = false;
        /// <summary>
        /// IsChecked
        /// </summary>
        public bool IsChecked
        {
            get { return isChecked; }
            set
            {
                if (isChecked != value)
                {
                    isChecked = value;
                    GenerePropertyChanged("IsChecked");
                }
            }
        }


        #region INotifyPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;

        private void GenerePropertyChanged(string Propriete)
        {
            if (this.PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(Propriete));
        }

        #endregion
    }



Dans ma fenêtre GenreAction, j'ai ajouté une listbox
        <ListBox Name="lstTest" ItemsSource="{Binding}" Margin="0,376,0,0">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <CheckBox Content="{Binding Titre}" IsChecked="{Binding IsChecked}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>


Et j'ai modifié le code behind comme suit
        //liste pour binding des cases à cocher
        List<TestACocher> lesTestsAcocher = new List<TestACocher>();
        public GenreAction(BiblioSerie BiblioSerie)
        {
            InitializeComponent();

            biblioSerie = BiblioSerie;//si tu en as besoin ailleurs dans le code behind

            this.DataContext = biblioSerie;//le datacontexte de la fenetre est cette instance de BiblioSerie

            //On crée la liste pour les cases à cocher 
            foreach (Serie s in biblioSerie.ListSerie)
            {
                TestACocher t = new TestACocher(s);
                t.PropertyChanged += T_PropertyChanged;//on s'abonne au propertyChanged
                lesTestsAcocher.Add(t);
            }

            //et on la binde
            lstTest.ItemsSource = lesTestsAcocher;


        }

        private void T_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "IsChecked")//quand la propriété Ischecked d'une instance change
            {
                //On prend ceux qui sont cochés et on fait comme je t'ai montré l'autre jour
                Categ reponseMax = lesTestsAcocher.Where(t => t.IsChecked).GroupBy(t => t.Genre).OrderByDescending(x => x.Count()).First().Key;
            }
        }


En l'état ça ne gère pas les exaequo, mais c'est rien à faire si tu penses en avoir besoin


Hamster18
Messages postés
58
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
17 octobre 2019
-
D'accord merci, j'essayerais d'appliquer cela à mes radioButton demain.
Cordialement.
Commenter la réponse de Whismeril