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 :

problèmes LINQ je crois


Sujet :

C#

  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut problèmes LINQ je crois
    Bonjour,
    2 petites questions s'il vous plaît. J'ai le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    List<PricingModelInfo> pricingModelInfos = new List<PricingModelInfo>();
    ...pricingModelInfos.Add(...);...
    PricingModelInfo pmi = ((PricingModelInfo)(pricingModelInfos.Select(x => x.modelName == modelName && x.modelVersion == modelVersion).First()));
    1/ J'ai l'erreur suivante : "Cannot convert type 'bool' to 'PricingModelInfo'" que je ne comprends pas...
    2/ Plutôt que de caster tout mon select avec toutes ces parenthèses, pourquoi est-ce que lorsque j'essaye le code suivant, j'ai l'erreur "'System.Collections.Generic.IEnumerable<bool>' does not contain a definition for 'First' and the best extension method overload 'System.Linq.ParallelEnumerable.First<TSource>(System.Linq.ParallelQuery<TSource>)' has some invalid arguments":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PricingModelInfo pmi = pricingModelInfos.Select(x => x.modelName == modelName && x.modelVersion == modelVersion).First<PricingModelInfo>();
    Peut-être que la solution à ma première question résoudra la 2ème en fait.
    Merci pour vos retours,

  2. #2
    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 : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Select sert à transformer ta source en "autre chose" en fonction du sélecteur donné.
    Ici ton sélecteur transforme chaque élément de ta source en bool
    Du coup le résultat du Select est un IEnumerable<bool> (et un appel à First dessus renverrait un bool [ou planterait si la collection est vide])
    et comme un bool n'est pas convertible en PricingModelInfo tu obtiens ton erreur 1)
    Pour la 2) c'est en gros la même chose, depuis ton IEnumerable<bool> tu tentes d'appel First<PriceModelInfo> or le "bon" First pour un IEnumerable<bool> serait First<bool> (ou simplement laisser l'inférence faire et utiliser First sans précision explicite) ; du coup le compilo ne trouves pas quelle méthode tu cherches et te le signale

    A priori, ce que tu cherches à faire c'est obtenir le premier élément pour lequel ton critère est vrai.
    S'il s'agit bien de cela il te faudrait remplacer ton Select par un Where, qui lui applique un prédicat (ton critère) à la source et ne conserve que les éléments (de ta source donc) pour lesquels le prédicat a renvoyé true ; puis utilisé First (ou FirstOrDefault) dessus.

    Mais tant qu'à faire autant directement utiliser la surcharge de First (ou de FirstOrDefault) qui prend en argument supplémentaire, un prédicat qui permet de retourner le premier élément pour lequel il est vrai

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    Effectivement, une grossière confusion entre select et where... Ca marche maintenant, merci!
    Je cherche bien a faire ce que tu dis. Par contre je ne comprends pas comment tu entends remplacer le First() par un 2eme prédicat dans le where, tu peux me montrer un exemple s'il te plait?
    Merci

  4. #4
    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 : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    tout est dans la documentation

  5. #5
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    OK, vous voulez dire que vous préfereriez écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PricingModelInfo pmi = pricingModelInfos.First(x => x.modelName == modelName && x.modelVersion == modelVersion);
    Plutôt que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PricingModelInfo pmi = pricingModelInfos.Where(x => x.modelName == modelName && x.modelVersion == modelVersion).First();
    C'est bien ça? Je suis d'accord effectivement. Merci

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

Discussions similaires

  1. Problème linq to sql - iis7
    Par boby62423 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 01/04/2009, 08h21
  2. Probléme Linq SQL column char(8) en Datetime ?
    Par alves.seb dans le forum Accès aux données
    Réponses: 6
    Dernier message: 01/09/2008, 16h38
  3. Problème linq to object
    Par Fayoul dans le forum Linq
    Réponses: 2
    Dernier message: 19/03/2008, 22h53
  4. Problème de tableaux croisé dynamique
    Par ANTMA dans le forum Excel
    Réponses: 3
    Dernier message: 21/12/2007, 15h39
  5. [MySQL] problème de requête croisé?
    Par gotcha5832 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 21/03/2007, 20h11

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