Partage
  • Partager sur Facebook
  • Partager sur Twitter

Method transposable à toutes mes dictionnaires.

    5 avril 2023 à 20:05:32

    Bonjour,

    Je débute en C# et je bute sur un problème. Je n'arrive pas à trouver la solution sur internet car je ne trouve pas les termes en anglais pour définir mon problème.

    En gros j'ai plein de dictionnaires qui ont la même structure à savoir un enum et un int. L'enum me sert à définir un état et le int la probabilité que cela arrive. J'ai fait ma petite fonction pour me donner un enum de retour mais le souci c'est que je n'arrive pas à transposer cette méthode à toutes mes autres énumérations sans réécrire une méthode par énumération. 

    En gros je souhaite que ma fonction puisse prendre n'importe quelle énumération de ce style :

      arm = new Dictionary<E_upperarm_state, int>() ;
            arm.Add(E_upperarm_state.Normal, 9900);
            arm.Add(E_upperarm_state.Weak, 50);
            arm.Add(E_upperarm_state.Strong, 50);
    
    
      finger = new Dictionary<E_finger_state, int>() ;
            finger.Add(E_finger_state.Normal, 9900);
            finger.Add(E_finger_state.Weak, 50);
            finger.Add(E_finger_state.Strong, 50);


    Puis passer le dictionnaire dans cette fonction. J'ai mis le mot Enum à la place du nom exact de l'enum pour l'exemple (donc dans la première, Enum devient E_upperarm puis Enum devient E_finger_state. 

        public Enum GenerateProbabilitie(Dictionary<Enum, int> probabilitie)
        {
    
            Enum correspondance_probabilitie = Enum.None;
            int cumul_probabilitie = 0;
    
            foreach (var item in probabilitie)
            {
                cumul_probabilitie = cumul_probabilitie + item.Value;
            }
    
            Random rand = new Random();
            int random_number = rand.Next(0, cumul_probabilitie);
    
            int index = 0;
            int cumul_pourcentage = 0;
            foreach (var item in probabilitie)
            {
                cumul_pourcentage = cumul_pourcentage + item.Value;
                if (index <= random_number && random_number < cumul_pourcentage)
                {
                    correspondance_probabilitie = item.Key; break;
                }
                else
                {
                    index = cumul_pourcentage;
                }
            }
            return correspondance_probabilitie;
        }


    Existe il une façon de m'éviter d'avoir à réécrire le même code pour chaqu'une de mes énumérations?

    Merci d'avance,

    • Partager sur Facebook
    • Partager sur Twitter
      6 avril 2023 à 15:23:46

      Tu es proche d'une bonne façon:

      public Enum GenerateProbabilitie<TEnum>(Dictionary<TEnum, int> probabilitie) where TEnum :Enum
          {
              Enum? correspondance_probabilitie = null;
          [...]//ton code
      }
      
      [..]
      var s1=GenerateProbabilitie<E_upperarm_state>(arm);
      var s2=GenerateProbabilitie<E_finger_state>(finger);



      • Partager sur Facebook
      • Partager sur Twitter
        6 avril 2023 à 22:39:23

        Bonjour, 

        Merci de ta réponse,

        J'ai essayé ta solution mais j'ai toujours une erreur.

        Erreur	CS0266	Impossible de convertir implicitement le type 'System.Enum' en 'E_upperarm_state'. Une conversion explicite existe (un cast est-il manquant ?)	

        Après ton message j'ai cherché avec les éléments que tu m'as fourni et j'ai bidouillé une solution que je ne comprend pas :p (mais qui marche).

            public TEnum GenerateProbabilitie<TEnum>(Dictionary<TEnum, int> probabilitie) where TEnum : Enum
            {
               
                TEnum correspondance_probabilitie = default(TEnum);
        
        (reste du code) 
        }

        Je vais aller me renseigner sur les generics, ça à l'air sympa pour se simplifier la vie =).

        Encore merci pour ton aide, sans quoi je serais toujours bloqué!

        EDIT : 

        J'ai encore bidouillé pour essayé de comprendre et j'arrive en simplifiant à cela : 

                public Enum GenerateProbabilitie<Enum>(Dictionary<Enum, int> probabilitie)
            {
                Enum correspondance_probabilitie = default(Enum);
        reste du code }


        Est ce que c'est aussi juste que la méthode au dessus?

        • Partager sur Facebook
        • Partager sur Twitter
          7 avril 2023 à 13:14:33

          ça a l'air de fonctionner.
          • Partager sur Facebook
          • Partager sur Twitter

          Method transposable à toutes mes dictionnaires.

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown