none
[C#]Méthodes Delegates et Génériques RRS feed

  • Discussion générale

  • Bonjour,

    J’aimerais savoir s’il est possible de créer des méthodes à la fois générique et delegate. J’ai quatre méthodes qui enfaite ne pourraient qu’en former deux si je savais comment faire des méthodes delegate générique. En effet, j’utilise deux méthodes qui on exactement le même code par contre ils utilisent un type différant et c’est type passe dans un delegate. Est-ce possible? Je vous joins ci-dessous mon code des quatre méthodes. Si vous savez comment cela serait possible, faite moi signe!


    Merci Beaucoup!

    void ClasserJoueursCroissant()
    {
        ListeDeJoueurs.Sort(delegate(Joueur x, Joueur y)
        {
            if (x.Moyenne < y.Moyenne) return -1;
            else if (x.Moyenne > y.Moyenne) return 1;
            return 0;
        });
    }
     
    void ClasserJoueursDécroissant()
    {
        ListeDeJoueurs.Sort(delegate(Joueur x, Joueur y)
        {
            if (x.Moyenne > y.Moyenne) return -1;
            else if (x.Moyenne < y.Moyenne) return 1;
            return 0;
        });
    }
     
    void ClasserÉquipesCroissant()
    {
        ListeDesÉquipes.Sort(delegate(Équipe x, Équipe y)
        {
            if (x.Moyenne < y.Moyenne) return -1;
            else if (x.Moyenne > y.Moyenne) return 1;
            return 0;
        });
    }
     
    void ClasserÉquipesDécroissant()
    {
        ListeDesÉquipes.Sort(delegate(Équipe x, Équipe y)
        {
            if (x.Moyenne > y.Moyenne) return -1;
            else if (x.Moyenne < y.Moyenne) return 1;
            return 0;
        });
    }
    

    • Type modifié Aurel Bera lundi 12 mai 2014 11:46 disc
    dimanche 4 mai 2014 20:52

Toutes les réponses

  • Bonjour

    Vous pouvez adapter ces examples :

    http://msdn.microsoft.com/fr-fr/library/sx2bwtw7.aspx

    Bien cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    lundi 5 mai 2014 12:03
  • Bonjour

    Un petit retour SVP?

    Merci!

    Bien cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    vendredi 9 mai 2014 11:31
  • Bonjour,

    Il y a plusieurs solutions au problème, tout dépend ce que vous souhaitez réellement faire. Voici grosso modo, une première implémentation. Je n'ai pas testé mais essayé de faire un code regroupant les différentes problématiques. 

    using System.Collections.Generic;
    public class Test
    {
        interface IClassable
        {
            double Moyenne { get; set; }
        }
    
        class Joueur : IClassable
        {
            public double Moyenne
            {
                get;
                set;
            }
        }
    
        class Équipe : IClassable
        {
            public double Moyenne
            {
                get;
                set;
            }
        }
    
        List<Joueur> ListeDeJoueurs = new List<Joueur>();
        List<Équipe> ListeDesÉquipes = new List<Équipe>();
    
        void ClasserCroissant<T>(List<T> lst) where T : IClassable
        {
            lst.Sort((x, y) =>
            {
                if (x.Moyenne < y.Moyenne) return -1;
                else if (x.Moyenne > y.Moyenne) return 1;
                return 0;
            });
        }
    
        void ClasserDécroissant<T>(List<T> lst) where T : IClassable
        {
            lst.Sort((x, y) =>
            {
                if (x.Moyenne > y.Moyenne) return -1;
                else if (x.Moyenne < y.Moyenne) return 1;
                return 0;
            });
        }
    
        public void CallIt()
        {
            ClasserCroissant(ListeDeJoueurs);
            ClasserCroissant(ListeDesÉquipes);
            ClasserDécroissant(ListeDeJoueurs);
            ClasserDécroissant(ListeDesÉquipes);
        }
    }

    La principale problématique est tout simplement d'exposer l'attribut "Moyenne" à vos classes Joueurs et Equipes. Pour résoudre le problème, j'ai simplement créé une interface IClassable possédant cet attribut et l'ai implémenté dans la classe joueur et équipe. 

    Ceci réalisé, l'implémentation des méthodes classer devient triviale  (Vous noterez au passage l'utilisation de lambdas (syntaxe "lst.Sort((x, y) =>")   à la place des delegates anonymes plus anciennes (il aurait fallu écrire "lst.Sort(delegate(T x, T y) ")

    Vous noterez que ma méthode est générique et que de l'inférence de type est utilisé (cf. la méthode CallIt où l'on ne précise pas le type de List).

    Il y a d'autres solutions possibles, je vous ai proposé l'une d'entre elles, j'espère qu'elle vous conviendra.

    Bien Cordialement,

    Fabrice

    vendredi 16 mai 2014 15:30