Donner un enum dans une variable
Résolu
Hamster18
Messages postés
176
Date d'inscription
Statut
Membre
Dernière intervention
-
Hamster18 Messages postés 176 Date d'inscription Statut Membre Dernière intervention -
Hamster18 Messages postés 176 Date d'inscription Statut Membre Dernière intervention -
A voir également:
- Donner un enum dans une variable
- Donner son adresse sur le bon coin - Forum Consommation & Internet
- Comment donner des droits d'accès à un fichier pix ✓ - Forum Jeux vidéo
- Droits d'acces ✓ - Forum Windows
- Ce programme est écrit en python. il construit un mot secret dans une variable mais il ne l'affiche pas. modifiez-le pour qu'il affiche le mot secret. exécutez-le. quel est ce mot secret ✓ - Forum Python
- Le fichier contient un programme écrit en python. le programme construit un mot secret mais il ne l'affiche pas. modifiez ce programme afin que à chaque itération de la boucle : la variable a augmente de 2 la variable b diminue de 1 ajoutez une instruction pour faire afficher le mot secret construit. quel est ce mot secret ? ✓ - Forum Python
3 réponses
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 :
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
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
176
Date d'inscription
Statut
Membre
Dernière intervention
Je n'ai jamais utilisé de Dictionary comment ça s'utilise ?
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à
Un peu moins pire, en lignes de codes et en temps d'exécution.
Utiliser un compteur....
Mais bon t'as 50 variables, pour rien au final.
Mieux: faire un groupement

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
Dans mon cas, reponseMax vaut Action
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
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.
Dans ma fenêtre GenreAction, j'ai ajouté une listbox
Et j'ai modifié le code behind comme suit
En l'état ça ne gère pas les exaequo, mais c'est rien à faire si tu penses en avoir besoin


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

