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 :

Comment utiliser la méthode Aggregate?


Sujet :

C#

  1. #1
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Points : 138
    Points
    138
    Par défaut Comment utiliser la méthode Aggregate?
    Bonjour,
    J'ai le code suivant qui plante au niveau de mon appel à Aggregate avec l'erreur "Error 1 Cannot convert lambda expression to delegate type 'System.Func<RiskFactor,RiskFactor,RiskFactor>' because some of the return types in the block are not implicitly convertible to the delegate return type
    Error 2 Cannot implicitly convert type 'double' to 'RiskFactor'".
    En effet il cherche à retourner un objet riskFactor alors que je cherche à avoir juste un double. Comment lui faire retourner juste le résultat de la multiplication de tous mes éléments "factor" dont le label vaut "toto"?
    Code C# : 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
    public class RiskFactor {
    	public string label;
    	public double? factor;
    }
    List<RiskFactor> riskFactors = new List<RiskFactor>();
    RiskFactor riskFactor;
    for (int i = 1; i < 5; i++) {
    	riskFactor = new RiskFactor();
    	riskFactor.label == "toto";
    	riskFactor.factor = i * 2;
    	riskFactors.Add(riskFactor);
     
    	riskFactor = new RiskFactor();
    	riskFactor.label == "titi";
    	riskFactor.factor = i * 3;
    	riskFactors.Add(riskFactor);
    }
    double res = riskFactors.Where(x => x.label == "toto").Aggregate((x, y) => ((x.factor.HasValue ? x.factor.Value : 1) * (y.factor.HasValue ? y.factor.Value : 1)));
    Je sais que je peux faire comme ceci :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    double res = 1;
    foreach (var item in riskFactors) {
    	if (item.label == "toto") {
    		res *= (item.factor.HasValue ? item.factor.Value : 1);
    	}
    }
    Mais vu ce que je dois réellement en faire dans mon code, je voudrais savoir le faire avec LINQ.
    Merci pour votre aide,

  2. #2
    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 : 41
    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
    La surcharge d'Aggregate que tu utilises se sert du premier élément de la collection source pour définir la valeur initiale de l'accumulateur pour l'agrégation ; par conséquent son type (et donc le type du résultat final) sera le même que celui des éléments de la source.
    Dans ton cas tu veux un autre type pour cet accumulateur (et le résultat final) donc il faut que tu utilises une autre surcharge d'Aggregate qui prend en plus en premier argument (second si non-utilisée comme méthode d'extension), la valeur initiale de ton accumulateur (a priori dans ton cas il te faudrait utiliser "1" car c'est la valeur neutre de la multiplication)

  3. #3
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Points : 138
    Points
    138
    Par défaut
    Effectivement c'est bien ça merci.
    A la différence près qu'il faut mettre 1.0 pour avoir un double et non un int.
    Ca me donne le code suivant :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    double res = riskFactors.Where(x => x.label == "toto").Aggregate(1.0, (x, y) => (x * (y.factor.HasValue ? y.factor.Value : 1.0)));

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

Discussions similaires

  1. comment utiliser la méthode startService()
    Par d_hazem dans le forum Wildfly/JBoss
    Réponses: 0
    Dernier message: 17/12/2008, 10h22
  2. [POO] Comment utiliser la méthode isValid d'un DateField
    Par alicia1984 dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 30/07/2008, 14h33
  3. Réponses: 1
    Dernier message: 24/10/2007, 11h01
  4. Réponses: 0
    Dernier message: 26/09/2007, 16h08
  5. Réponses: 8
    Dernier message: 19/06/2006, 15h31

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