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

Linq Discussion :

Calcul de moyenne (prix au m²) en LINQ


Sujet :

Linq

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Par défaut Calcul de moyenne (prix au m²) en LINQ
    Bonjour!

    Je butte sur un problème, j'essaie de calculer la moyenne des prix au m² pour une liste de résultats voici ma requete LINQ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var MoyenneSurfaceVenteMettreCarre = (from row in maDt.AsEnumerable()
    let division = Convert.ToInt32(row.Field<decimal>("ST_MONTANT")) / Convert.ToInt32(row.Field<float>("ST_SURFACE"))
    select division).Average();
    Celle ci me renvoi systematiquement un invalidcastexception sur le Average()

    Si vous avez une idée je suis prenneur

    Merci!

  2. #2
    Membre Expert
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Par défaut
    Plus d'infos sur l'exception ?

    C'est peut être ton Convert.ToInt32 qui ne marche pas.

    Tu pourrais aussi récupérer les informations via LINQ et faire ton calcul par la suite.
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Par défaut
    l'exception exacte est [System.InvalidCastException] = {"Le cast spécifié n'est pas valide."}

    J'ai essayé aussi de caster en double ou decimal meme resultat...

    Pour l'autre solution que tu donnes j'y ai pensé et essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    var MoyenneSurfaceVenteMettreCarre = (from row in maDt.AsEnumerable()
     
    select new {surface=Convert.ToInt32(row.Field<float>("ST_SURFACE")),montant=Convert.ToInt32(row.Field<decimal>("ST_MONTANT"))});
     
    decimal SumSurfPrix = 0;
    foreach (var row in MoyenneSurfaceVenteMettreCarre)
    {
    SumSurfPrix += Convert.ToInt32(row.montant) / Convert.ToInt32(row.surface);
    }
     
    SumSurfPrix = SumSurfPrix / MoyenneSurfaceVenteMettreCarre.Count()
    Mais le souci c'est qu'on ne peut pas boucler sur "MoyenneSurfaceVenteMettreCarre" on est obligé de boucler par exemple sur "MoyenneSurfaceVenteMettreCarre.montant" ce qui m'arrange pas car du coup j'ai pas les surfaces...

    Bon il doit y avoir un moyen plus simple j'imagine?

  4. #4
    Membre Expert
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Par défaut
    Pourquoi ne peux-tu pas boucler sur MoyenneSurfaceVenteMettreCarre ?
    C'est un IEnumerable de to type anonyme, il n'y a pas de raisons que tu ne puisse faire une boucle avec...
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Par défaut
    Oui tu as raison, en fait la boucle ne marche pas a cause de cette fameuse erreur de cast

  6. #6
    Membre Expert
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Par défaut
    Donc ça provient du cast du contenu de tes cellules qui sont à l'origine des float en Int32.

    Ce qui ne devrait pas arriver vu qu'on peut aisément convertir un float en entier.

    Quel est le contenu de tes cellules ?
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  7. #7
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Par défaut
    bon provisoirement j'ai fait ca mais je trouve ca naze...ca prend tout les champs du datatable et j'aime pas...la solution linq serait vraiment mieux si elle marchait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    foundRows = maDt.Select("ST_SURFACE > 0 AND ST_MONTANT > 0");
     
    double MoySurfPrixVente = 0;
     
    foreach (DataRow Row in foundRows)
       MoySurfPrixVente += Convert.ToDouble(Row["ST_MONTANT"]) / Convert.ToDouble(Row["ST_SURFACE"]);
     
    //calcul de la moyenne des prix au m²
    if(foundRows.Count()!=0)
         MoySurfPrixVente = MoySurfPrixVente / foundRows.Count();
    Si quelqun à une idée...

  8. #8
    Membre Expert
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Par défaut
    Surtout que la méthode select de la DataTable peut s'avérer très lente suivant le nombre de lignes...

    Et si l'erreur de cast provenait de la méthode Field de la DataRow ?
    Tu l'a déjà testé ailleurs afin de voir si ça fonctionne ?
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  9. #9
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Par défaut
    Oui je pense effectivement que ca vient de cette histoire de "field" mais en fait je suis obligé de mettre cette directive et caster sinon le linq ne marche pas...

    edit :

    Sinon pour le contenu des cellules ce sont des simples montants

    par exemple : 120 pour une surface ; 1500 pour un prix....

    Je me demande si ca viendrai pas d'une division par 0 pourtant je fais bien gaffe de pas prendre les zeros grace à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     where row.Field<float>("ST_SURFACE") != 0 && row.Field<float>("ST_MONTANT") != 0

  10. #10
    Membre Expert
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Par défaut
    Pour le division je ne pense pas, sinon ça ne te ferais pas une CastException.

    Par contre, si ce sont des entier pourquoi fais tu un Field vers un float ?

    Et un simple Row["ST_SURFACE"] ne marche pas ?
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  11. #11
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Par défaut
    ca y est j'ai trouvé!!!

    C'était tout con... en fait j'avais mal casté le montant dans le where...float au lieu de decimal!!



    Merci quand meme pour ton aide!!

    Donc:

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

Discussions similaires

  1. calcul moyenne prix
    Par vhoward99 dans le forum Développement
    Réponses: 9
    Dernier message: 08/06/2011, 11h36
  2. Programmation Shell avec Red Hat Calcul de moyenne
    Par jcpoulard dans le forum Linux
    Réponses: 3
    Dernier message: 22/02/2006, 22h08
  3. methode qui calcul une moyenne du traffic
    Par siry dans le forum Développement
    Réponses: 7
    Dernier message: 05/05/2005, 17h16
  4. calculer une moyenne avec une requete externe
    Par allowen dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2005, 16h02
  5. Calcul d'un prix
    Par maki dans le forum Flash
    Réponses: 16
    Dernier message: 26/09/2003, 17h24

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