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 :

Fonction max générique avec valeur nullable


Sujet :

C#

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut Fonction max générique avec valeur nullable
    Bonjour,
    Je cherchais à faire une fonction MAx avec un type générique de façon à ne pas réinventer la poudre.
    Voilà la fonction que j'ai écrite
    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
           /// <summary>
            /// Renvoie le max de deux valeurs nullables
            /// </summary>
            /// <typeparam name="T">type de base</typeparam>
            /// <param name="val1"></param>
            /// <param name="val2"></param>
            /// <returns></returns>
            public static T? Max<T>(T? val1, T? val2) where T : IComparable
            {
                T? retVal = null;
                if (val1 == null)
                    retVal = val2;
                if (val2 == null)
                    retVal = val1;
     
                if ((val1.HasValue) && (val2.HasValue))
                {
                    if (val2.Value.CompareTo(val1.Value) < 0)
                        retVal = val1;
                }
     
     
     
                return retVal;
            }
    Elle ne compile pas message d'erreur:
    Erreur 89 Le type 'T' doit être un type valeur non nullable afin d'être utilisé comme paramètre 'T' dans le type ou la méthode générique 'System.Nullable
    En revanche je ne vois pas quelle sotise j'ai commise, je m'en remet donc à vous.
    Merci
    Soazig

  2. #2
    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
    Il faut préciser que T est un type valeur, sinon T? n'a pas de sens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static T? Max<T>(T? val1, T? val2) where T : struct, IComparable

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    merci pour la réponse c'était bien cela, et voici la version finale de la fonction.
    La première avait un petit bug.
    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
    32
    33
    34
    35
            /// <summary>
            /// Renvoie le max de deux valeurs nullables , si l'une est nulle le maximum est l'autre
            /// </summary>
            /// <typeparam name="T">type de base</typeparam>
            /// <param name="val1"></param>
            /// <param name="val2"></param>
            /// <returns></returns>
            public static T? Max<T>(T? val1, T? val2) where T : struct, IComparable
            {
                T? retVal = null;
                if (val1 == null)
                    retVal = val2;
                if (val2 == null)
                    retVal = val1;
     
                if ((val1.HasValue) && (val2.HasValue))
                {
                    retVal = Max(val1.Value, val2.Value);
                }
                return retVal;
            }
            /// <summary>
            /// Renvoie le max de deux valeurs qui implémente Icomparable
            /// </summary>
            /// <typeparam name="T">type de base</typeparam>
            /// <param name="val1">première valeur à comparer</param>
            /// <param name="val2">deuxième valeur à comparer</param>
            /// <returns></returns>
            public static T Max<T>(T val1, T val2) where T :  IComparable
            {
                T retVal = val2;
                if (val2.CompareTo(val1) < 0)
                    retVal = val1;
                return retVal;
            }
    En espérant que cela puisse aider d'autres personnes.

  4. #4
    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
    Fais gaffe, dans ta 2e surcharge ça va planter sur val2 vaut null...

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    je ne comprends pas ta remarque tomlev.

    Fait gaffe, dans ta 2e surcharge ça va planter sur val2 vaut null...
    La deuxième surcharge:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     public static T Max<T>(T val1, T val2) where T :  IComparable
    C'est celle de signature non nullable.

    La première fonctionne avec des paramètres null.

    Soazig

  6. #6
    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 soazig Voir le message
    je ne comprends pas ta remarque tomlev.


    La deuxième surcharge:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     public static T Max<T>(T val1, T val2) where T :  IComparable
    C'est celle de signature non nullable.

    La première fonctionne avec des paramètres null.

    Soazig
    Bah si T est un type référence (String ou Version par exemple), ça peut être null... Si tu veux gérer seulement les types valeurs, ajoute une contrainte struct comme sur la 1e surcharge

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Et voilà, j'espère la version finale, je n'ai corrigé que la deuxième surcharge, et les commentaires de la première.
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
            /// <summary>
            /// Renvoie le max de deux valeurs nullables , si l'une est nulle le maximum est l'autre
            /// </summary>
            /// <typeparam name="T">type de base</typeparam>
            /// <param name="val1">première valeur à comparer</param>
            /// <param name="val2">deuxième valeur à comparer</param>
            /// <returns></returns>
            public static T? Max<T>(T? val1, T? val2) where T : struct, IComparable
            {
                T? retVal = null;
                if (val1 == null)
                    retVal = val2;
                if (val2 == null)
                    retVal = val1;
     
                if ((val1.HasValue) && (val2.HasValue))
                {
                    retVal = Max(val1.Value, val2.Value);
                }
                return retVal;
            }
            /// <summary>
            /// Renvoie le max de deux valeurs qui implémentent Icomparable
            /// </summary>
            /// <typeparam name="T">type de base</typeparam>
            /// <param name="val1">première valeur à comparer</param>
            /// <param name="val2">deuxième valeur à comparer</param>
            /// <returns></returns>
            public static T Max<T>(T val1, T val2) where T :  IComparable
            {
                T retVal = val2;
                if (val1 != null && val2 != null)
                {
                    if (val2.CompareTo(val1) < 0)
                        retVal = val1;
                }
                else
                    retVal = default(T);
                return retVal;
            }
    Merci de tes conseil tomlev.
    soazig

  8. #8
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    Le problème indiqué par Tomlev est ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (val2.CompareTo(val1) < 0)
    EDIT :
    Erf j'ai raté un bou de la discution

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonction MOD : problème avec valeur négative
    Par gadio dans le forum Requêtes
    Réponses: 2
    Dernier message: 09/10/2013, 19h46
  2. recuperer la valeur d une fonction Max avec jdbc
    Par mitnick2006 dans le forum JDBC
    Réponses: 2
    Dernier message: 09/05/2008, 11h17
  3. [Débutant / SQL] Requête avec la fonction MAX
    Par bugmenot dans le forum Access
    Réponses: 3
    Dernier message: 14/04/2006, 10h43
  4. Pb avec la fonction Max d'access
    Par abaad dans le forum Access
    Réponses: 1
    Dernier message: 03/04/2006, 17h43
  5. requete SQL avec valeur max
    Par oeil de nuit dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/01/2006, 08h58

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