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 :

Peut on introduire une variable avec Linq et les lambda expressions?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Par défaut Peut on introduire une variable avec Linq et les lambda expressions?
    Bonjour,
    Je suis actuellement en train d'utiliser linq et les lambda expression et je me pose une question concernant l'écriture.
    J'ai une reqûete qui ressemble à ceci.

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var listEnigme =  listEnigme .Where(e => 
    	e.SolutionList != null && 
    	e.SolutionList.FirstOrDefault(ls => ls.Number == e.SolutionList.Max(max=>max.Number)) != null &&
    	e.SolutionList.FirstOrDefault(ls => ls.Number == e.SolutionList.Max(max=>max.Number)).coef != null &&
    	e.SolutionList.FirstOrDefault(ls => ls.Number == e.SolutionList.Max(max=>max.Number)).coef < 100); break;

    Le but est d'obtenir la liste des énigme donc la dernière solution à un coefficient inférieur à 100.
    La dernière solution correspond à la solution ayant le plus grand Number.

    Je voudrais savoir s'il n'est pas possible d'introduire une variable afin de ne pas avoir à répeter
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    e.SolutionList.FirstOrDefault(ls => ls.Number == e.SolutionList.Max(max=>max.Number))

    En gros fgaire quelque chose comme ça:

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var listEnigme =  listEnigme .Where(e => 
    e.SolutionList != null && 
    ((mx => e.SolutionList.FirstOrDefault(ls => ls.Number == e.SolutionList.Max(max=>max.Number))) 
    	&& mx!=null
    	&& mx.coef != null &&
    		mx.coef < search.coef));

    Par avance merci beaucoup à vous.

  2. #2
    Membre émérite

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Par défaut
    Bonjour,

    Tu peux utiliser une méthode anonyme comme celle ci :

    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
     
    var listEnigme =  listEnigme.Where(e =>
        { 
            if(e.SolutionList == null)
                return false;
     
            var toto = e.SolutionList.FirstOrDefault(ls => ls.Number ==  e.SolutionList.Max(max=>max.Number));
     
            if(toto == null)
                return false;
     
            if(toto.coef == null)
                return false;
     
            if(toto.coef > search.coef)
                return false;
     
            return true;
        }
    C'est pas forcément le plus lisible et/ou le plus adapté mais je crois pas que l'on puisse faire autrement. Pas avec les lambdas en tout cas. Il faudrait peut être te tourner vers le LinQ pur et dur pour faire ce que tu veux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var listEnigme = 
    from e in listEnigme
     
    let toto = from e in listEnigme
    where e.SolutionList != null
    select e.SolutionList.FirstOrDefault(ls => ls.Number ==  e.SolutionList.Max(max=>max.Number));
     
    where toto != null
    && toto.coef != null
    && toto.coef < search.coef
     
    select e;
    J'espère t'avoir aidé.
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

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

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Bonjour,

    Pour ce dernier exemple ; ceci ne serait pas plus simple et/ou lisible ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var listEnigme = 
        from e in listEnigme
        where e.SolutionList != null
        let mx = e.SolutionList.Max(max => max.Number) // évite une réévaluation pour chaque ls
        let toto = e.SolutionList.FirstOrDefault(ls => ls.Number == mx)
        where toto != null
        && toto.coef != null
        && toto.coef < search.coef 
        select e;
    Cordialement !

Discussions similaires

  1. Réponses: 7
    Dernier message: 07/05/2010, 09h52
  2. [Variable] Déclarer une variable avec un nom dynamique
    Par jacquesh dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 10/02/2006, 14h11
  3. Utilisation d'une variable avec l'instruction 'USE'
    Par florantanplan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/11/2005, 10h39
  4. Introduire une variable dans une propriété
    Par priest69 dans le forum Access
    Réponses: 7
    Dernier message: 21/10/2005, 17h31
  5. Désigner une variable avec une variable?
    Par littleman dans le forum Paradox
    Réponses: 4
    Dernier message: 12/08/2002, 11h21

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