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 :

creation d'une class pour obtenir le nom d'une variable la plus proche d'une valeur choisi [Débutant]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2015
    Messages : 98
    Par défaut creation d'une class pour obtenir le nom d'une variable la plus proche d'une valeur choisi
    Bonjour a tous,
    Longue hésitation avant de poster ce 1er post, j'aime bien fouiller le net pour trouver les solutions mais la je suis en échec sur ce bout de code depuis trop longtemps alors je demande un peu d'aide.
    Merci d'avance a tous ceux qui pourront me filer un coup de main.

    J'ai une Bdd SQL server (local) avec une seul table composé d'une colonne "reponse" (string) et de X colonnes composé de 1 ou de 0 (byte).
    Je souhaite obtenir la somme de chaque colonne puis déterminer avec un petit trie ou une comparaison (sorte d'algo), la somme la plus proche d'une valeur déterminer à l'avance.
    Pour l’accès a la BDD j'ai essayer pas mal de choses: entity to SQL, to Object, to Entity, avec ou sans lambda , LinQ dynamic bref je suis pas chauvin . Les entities, Ienumerateur, obejectcontext reste des notions très flou pour moi alors je les ai toutes tester avec plus ou moins de succès mais jusque la je travailler exclusivement dans le code. Je me lance dans la création de méthode et je suis en misère.

    Autre soucis, ancien adepte du php je me lance dans le c# et essayer de réfléchir en php puis de le traduire en c# est une mauvaise manière de réfléchir mais c'est dur de racrocher .

    Je vous donne mon code C# et celui en php qui fonctionne très bien au cas ou mes explications ne seraient pas assez claires.

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Data;
    using System.Data.Entity;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data.Entity.Core.Objects;
    using System.Data.Entity.Core.Objects.DataClasses;
    using DiaDocV1.App_Data;
    using System.Text;
    using System.Globalization;
    using System.Data.SqlClient;
    using System.Data.Common;
    using System.Data.Entity.Core.EntityClient;
    using System.Linq.Dynamic;
     
    namespace Dadidou
    {
        public partial class pagetestEF : System.Web.UI.Page
        {
            public partial class effet // La méthode qui doit me renvoyer le nom de la colonne dont la somme est la plus proche d'une valeur determiné
            {
                public double bidu;   // la variable qui stock cette somme
                public string Name;  // nom de la colonne
                public int Somme;   // somme de la colonne
     
                public effet()
                {
                    using (var db = new DiagEntities())   // appel  de mon fichier edmx qui contiens les info de la bdd "DiagTab"
                    {
                        effet[] pets = { new effet {Name= "sumvivant", Somme= db.DiagTabs.Sum(p => p.Vivant)}, //4   -   5,5
                                 new effet {Name="sumpetit", Somme= db.DiagTabs.Sum(p => p.Petit)},   //13   -3,5
                                 new effet {Name="summanger", Somme= db.DiagTabs.Sum(p => p.Manger)},  //3    - 6,5
                                 new effet {Name="sumbricolage", Somme= db.DiagTabs.Sum(p => p.Bricolage) }, //6   - 3,5
                                 new effet {Name="sumeanimal", Somme=db.DiagTabs.Sum(c => c.Animal) },  //3    -6,5
                                 new effet {Name="sumcuisine", Somme=db.DiagTabs.Sum(c => c.Cuisine) }, //4     5,5
                                 new effet {Name="sumefeminin", Somme=db.DiagTabs.Sum(c => c.Feminin) }, //13    - 3,5
                                 new effet {Name="sumtienmain", Somme=db.DiagTabs.Sum(c => c.Tienmain) }, //11   - 1,5
                                 new effet {Name="sumbureau", Somme=db.DiagTabs.Sum(c => c.Bureau) }  //3     -6,5
                                    };
     
                        foreach (effet item in pets)   // j'ai choisi comme valeur a s'approcher pour l’instant "9,5"
                        {
                            double[] boubou = new[] { Math.Abs(9.5 - item.Somme) }; // création d'un tableau qui récupère en valeur absolue l'écart par rapport à 9,5 
     
                            double ValeurMax = boubou[0];  // on initialise,  pour l’instant VarMax égal a valeur de boubou[0]                       
     
                            for (int i = 0; i < boubou.Length; i++)
                            {
                                if (boubou[i] < ValeurMax)
                                {
                                    ValeurMax = boubou[i];
                                }
                                double bidu = ValeurMax;
                            }
     
     
                        }
                    }
                } 
            } 
     
     protected void Page_Load(object sender, EventArgs e)  // a la suite ma class http qui va afficher des truc sur ma page web
            { 
              effet toto = new effet(); // appel de la class effet 
                Tata5.Text = toto.bidu();  // requete qui doit me renvoyer... je sais plus vraiment quoi, la valeur? l'item, bref c'est faux...
    voila pour le code.
    - Bon l'algo ne va pas. Est-ce qu'un tri des valeurs absolue dans une liste type "enumerator" et la selection du dernier "Last" ne serait pas plus judicieux? J'ai essayer mais je n'arrive pas à récuperer ensuite le nom de la variable qui va bien...
    - La méthode est aussi foireuse, j'ai tenté un Out in bidu mais sans grand succés
    -la récupération de la requêtes ensuite pour l'afficher (ou en faire autre choses) n'est pas bonne non plus mais comme le reste ne fonctionne pas difficile de l'évaluer (exeption overflow).

    Voila si vous pouvez m'aider sur un de ces 3 points ou même les 3 ça serait vraiment sympas.
    Si ça peut aider j'ai refait le truc en php qui marche lui a la perfection , voici le code :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    <?php 
     
    				$req = $bdd->prepare('SELECT SUM(c_vivant) AS sum_vivant, 
    											 SUM(Petit) AS sum_petit,
    											 SUM(manger) AS sum_manger,
    											 SUM(bricolage) AS sum_bricolage,
    											 SUM(c_animal) AS sum_c_animal,
    											 SUM(cuisine) AS sum_cuisine,
    											 SUM(feminin) AS sum_feminin,
    											 SUM(tien_main) AS sum_tien_main,
    											 SUM(dans_bureau) AS sum_dans_bureau											 
    									 FROM animal_seq');
    	$req->execute();
     
    	while ($donnees2 = $req-> fetch())
    			{
     
    			$colonn1 = $bdd->prepare('SELECT COUNT(REPONSE) FROM animal_seq');
    			$colonn1->execute();
    			$nligne1 = $colonn1->fetchAll(PDO::FETCH_COLUMN, 0);
    			$notre_chiffre1= $nligne1[0]/2; //permet de définir une variable reference (=nombre de ligne restante /2 et pour mon exemple j'ai mis 9,5)
     
    				if ($nligne1[0]>=0 && $nligne1[0]<21)
    						{
    						foreach($donnees2 as $new)
    								{
    								//on cree une variable qui sera notre ecart en valeur absolue
    								$abs=abs($new-$notre_chiffre1);             
    								//et on cree un nouveau tableau $array qui contiendra la valeur "normale" associee a son ecart par 
    								//rapport au nombre choisi en valeur absolue (ou plutot l'inverse)
    								$array[$abs]=$new;  
    								}		
    						ksort($array);  //on trie les clés dans l'ordre croissant 
    						$ecartok=current($array); //on recupere le premier element du tableau $array
    						$key = array_search($ecartok, $donnees2); // retourne la clé de la valeur trouvé
    						}
    				elseif($n_ligne==0)
    						{
    						echo 0;
    						}
    			}		 
    $req->closeCursor();						  
    ?>
    Encore une fois merci de votre aide

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    si j'ai bien compris, ca m'a l'air bien compliqué dans ta tête alors que c'est plutot simple

    si tu as une valeur dans une variable, et que tu cherches quelle sum(colonne) est plus proche de cette valeur il suffit de faire
    récupération des valeurs sum avec ado.net, toutes les techniques de lecture de données que tu sites ne sont que des surcouches répondant à des problématiques, pour lire des données tu peux utiliser le truc de base, undbcommand.Executeader

    après tu parcours chaque valeur pour trouver la plus petite différence (rien de sorcier non plus)

    et c'est tout...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre confirmé
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2015
    Messages : 98
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    ca m'a l'air bien compliqué dans ta tête
    On ne peut plus d'accord avec toi . Du coup je ne suis pas sure que repartir sur un nouveau truc après 2 mots lapidaire lâché sur un forum soit la solution a mon problème
    Je suis parti sur un map de Server edmx, couche supplémentaire je te l'accorde MAIS, censé simplifier les choses ! Donc bon je voudrais essayer de me caler dessus et avancer un peu dans cette direction.

    J'ai refait un code peut être plus simple pour la mise en place du tri(ou algo) ultérieurement mais tellement sale que j'ai honte de l'inscrire J'ai intégré la valeur absolue dans le tableau et roulez!

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
     public class Hazard
        {
            public string _Name;
            public int _Somme;
            public double _Absolute;
     
       }
            public string Effet()
            {
                DiagEntities db = new DiagEntities();
                Hazard[] pets = { new Hazard {_Name= "sumvivant", _Somme= db.DiagTabs.Sum(p => p.Vivant), _Absolute = Math.Abs(9.5 - (db.DiagTabs.Sum(p => p.Vivant)))}, 
                                 new Hazard {_Name="sumpetit", _Somme= db.DiagTabs.Sum(p => p.Petit), _Absolute = Math.Abs(9.5 - (db.DiagTabs.Sum(p => p.Petit)))}, 
                                 new Hazard {_Name="summanger", _Somme= db.DiagTabs.Sum(p => p.Manger), _Absolute = Math.Abs(9.5 - (db.DiagTabs.Sum(p => p.Manger)))},
                                 new Hazard {_Name="sumbricolage", _Somme= db.DiagTabs.Sum(p => p.Bricolage), _Absolute = Math.Abs(9.5 - (db.DiagTabs.Sum(p => p.Bricolage)))},
                                 new Hazard {_Name="sumeanimal", _Somme=db.DiagTabs.Sum(p => p.Animal), _Absolute = Math.Abs(9.5 - (db.DiagTabs.Sum(p =>p.Animal)))},  
                                 new Hazard {_Name="sumcuisine", _Somme=db.DiagTabs.Sum(p => p.Cuisine) , _Absolute = Math.Abs(9.5 - (db.DiagTabs.Sum(p => p.Cuisine)))}, 
                                 new Hazard {_Name="sumefeminin", _Somme=db.DiagTabs.Sum(p => p.Feminin), _Absolute = Math.Abs(9.5 - (db.DiagTabs.Sum(p => p.Feminin)))},
                                 new Hazard {_Name="sumtienmain", _Somme=db.DiagTabs.Sum(p => p.Tienmain) , _Absolute = Math.Abs(9.5 - (db.DiagTabs.Sum(p => p.Tienmain)))},
                                 new Hazard {_Name="sumbureau", _Somme=db.DiagTabs.Sum(p => p.Bureau) , _Absolute = Math.Abs(9.5 - (db.DiagTabs.Sum(p => p.Bureau)))}  
                                    };
     
                foreach (Hazard item in pets)
                {
                    double ValeurMax = item._Absolute[0]; // on initialise,  pour l'instand VarMax egal a valeur de l'index 0    
     
     
                    for (int i = 0; i < pets.Length; i++)
                    {                  
                            if (_Absolute[i] < ValeurMax)
                            {
                                ValeurMax = _Absolute[i];
                            }                                               
                        }               
                }
                return _Name;
            }
            }
    ce code n'est pas fonctionnelle car "double ValeurMax = item._Absolute[0]" ne fonctionne pas , le [] ne peut pas être employer sur des valeurs double du coup je ne sait pas trop les modification à faire...
    Je veut juste récupérer le nom de la colonne dont la somme s'approche le plus d'une valeur choisi, ici 9,5

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    oui, j'avais bien pensé que si j'avais bien compris mon post ne servirait à rien ^^

    si on part d'un tableau de nom/sum, je vois bien un truc dans le genre :

    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
     
    {
        double sumplusprès = 0;
        foreach (void ligne_loopVariable in tableau) {
            ligne = ligne_loopVariable;
            if (abs(ligne.sum - recherché) < sumpluspres)
                sumplusprès = abs(ligne.sum - recherché);
        }
     
        string nomplusprès = null;
        foreach (void ligne_loopVariable in tableau) {
            ligne = ligne_loopVariable;
            if (abs(sumplusprès - recherché) == sumplusprès) {
                nomplusprès = ligne.nom;
                break; // TODO: might not be correct. Was : Exit For
            }
        }
    }
    (traduit du vb.net, pas regardé le c# obtenu)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre confirmé
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2015
    Messages : 98
    Par défaut
    Mmmm ça ma l'air sympathique tous ça!

    Merci pour ton aide!
    j'exploite ça ce soir après le boulot et te fait un retour . La nuit va être courte

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Par défaut
    Je ne sais pas si j'ai bien compris le besoin. J'ai simplifié et fait un exemple.

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
     
    namespace UnitTestProject1
    {
        [TestClass]
        public class UnitTest1
        {
            [TestMethod]
            public void TestMethod1()
            {
                var values = new List<Tuple<string, int>>
                {
                    new Tuple<string,int>("value_1", 1),
                    new Tuple<string,int>("value_2", 13),
                    new Tuple<string,int>("value_3", 666)
                };
     
                const int testValue = 99;
     
                var nearest = (from v in values where Math.Abs(testValue - v.Item2) == values.Min(x => Math.Abs(testValue - x.Item2)) select v).First();
     
                Assert.AreEqual(13, nearest.Item2);
            }
        }
    }

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

Discussions similaires

  1. [Python 2.X] Creation d'un classe pour incrémenter une liste
    Par nekcorp dans le forum Général Python
    Réponses: 9
    Dernier message: 13/02/2015, 13h40
  2. Outils ou Classe pour obtenir un WSDL à partir d'une classe PHP
    Par denisdlu dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 21/07/2014, 12h17
  3. Réponses: 8
    Dernier message: 23/06/2006, 22h53
  4. thread dédié à une classe pour lui "donner vie"
    Par Dje14 dans le forum Threads & Processus
    Réponses: 5
    Dernier message: 02/06/2005, 16h46
  5. Réponses: 7
    Dernier message: 08/01/2005, 13h24

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