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 :

Inversion de règle Func<T,bool>


Sujet :

C#

  1. #1
    Membre habitué Avatar de Nadinette
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 264
    Points : 144
    Points
    144
    Par défaut Inversion de règle Func<T,bool>
    Salut,

    J'ai créé une Func pour avoir une règle définie à un seul endroit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            internal static Func<RULE, bool> ActiveRULE()
            {
                return (r => (!r.END_DATE.HasValue || (r.END_DATE.HasValue && r.END_DATE.Value >= DateTime.Now)) && (!r.DISABLED_DATE.HasValue));
            }
    Je l'utilise comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
            public List<AdditionalRightsModel> GetActiveAdditionalRightRules()
            {
                List<AdditionalRightsModel> toReturn = null;
                using (var _dbContext = new MatisContext(true))
                {
                    toReturn = _dbContext.RULE
                        .Where(ActiveRULE())
                        .Where(r => r.TYPE == (byte?)enRuleTypesByte.AdditionalRight)
                        .OrderByDescending(r => r.CREATION_DATE)
                        .Select(r => r.ToAdditionalRightRulesModel(true)).ToList();
                }
                return toReturn;
            }
    Comme la négation de la règle n'est pas très simple, je voudrait pouvoir écrire un truc du style Not maRegle() mais je ne trouve pas la syntaxe.

    Ne fonctionne bien sur pas

    Pourriez-vous m'aider ?

    Merci

  2. #2
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Et pourquoi ne pas essayer ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Where(r => !ActiveRULE()(r))
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  3. #3
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Tu ne peux pas utiliser la syntaxe que tu souhaites l'opérateur ! sert à inverser un bool mais toi tu as un Func<RULE, bool>.
    Il te faudrait utiliser une lambda au niveau de l'appel .Where (rule => !ActiveRule () (rule)) là on donne une lambda qui prend un argument (rule), appelle ActiveRule ce qui nous donne le Func puis on l'utilise avec rule comme argument et enfin on inverse le résultat.

    Après tu peux te faire une méthode pour inverser le résultat de l'appel à ce Func et donc t'en servir en composant les fonctions, ce qui donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Func<T, bool> Not<T> (Func<T, bool> predicate)
    {
        return arg => !predicate (arg);
    }
     
    // ...
    .Where (Not (ActiveRule ()))
    Ici on a encapsulé le comportement défini par la lambda dans l'exemple précédent dans une méthode générique ce qui nous donne la méthode Not qui prend un prédicat et renvoie un nouveau prédicat (qui inverse le résultat de l'appel) et on l'utilise en le composant ActiveRule.
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  4. #4
    Membre habitué Avatar de Nadinette
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 264
    Points : 144
    Points
    144
    Par défaut
    Salut,

    Désolé d'être neunette mais je ne comprends pas bien où tu ranges la méthode Not qui semble ne pas être statique.

    Tu peux préciser ?

    Merci

  5. #5
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Dans une classe (potentiellement static si on veut en plus en faire une méthode d'extension) en tant que méthode static ça peut être bien (je vois pas de raison d'en faire une méthode d'instance du coup mon extrait de code c'est concentré sur le code en lui-même)
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

Discussions similaires

  1. Règle inverse à appliquer
    Par Hombe dans le forum VBA Outlook
    Réponses: 0
    Dernier message: 02/02/2011, 11h52
  2. Obligatoire : lisez les règles du forum : MAJ 06/08/2010
    Par Anomaly dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 0
    Dernier message: 03/07/2008, 13h46
  3. Règles d'utilisation des forums C
    Par Franck.H dans le forum C
    Réponses: 3
    Dernier message: 26/01/2008, 17h35
  4. [IMPORTANT] Rappel des règles
    Par Community Management dans le forum C++
    Réponses: 4
    Dernier message: 11/12/2006, 23h11
  5. [VB6]fonction inverse de Hex (nombres hexadécimaux)
    Par Guigui_ dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 08/10/2002, 19h31

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