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 :

Trouver des données [Débutant]


Sujet :

Linq

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut Trouver des données
    Bonjour à toutes et à tous.

    Soit un List<Vecteur> dont Vecteur contient, entre autre, PtExtremite1 et PtExtremite2.

    Je cherche tous les vecteurs dont les extrémités soient 2 points définis, quelle que soient leur position (PtExtremite1 ou PtExtremite2).

    J'ai écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var q = from c in this
            where ((c.PtExtremite1 == pt1 || c.PtExtremite1 == pt2) && (c.PtExtremite2 == pt1 || c.PtExtremite2 == pt2))
            select c;
    mais il me sort toujours null.

    Il me semble pourtant qu'il devrait sortir les vecteurs dont PtExtremite1 vaut un des 2 points et PtExtremite2 aussi.

    Où me suis-je trompé et comment devrais-je faire ?

    Merci de vos z'avis z'avisés,
    Jean-Marc
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    where ((c.PtExtremite1 == pt1 || c.PtExtremite1 == pt2) && (c.PtExtremite2 == pt1 || c.PtExtremite2 == pt2))
    where ((c.PtExtremite1 == pt1 || c.PtExtremite2 == pt2) && (c.PtExtremite2 == pt1 || c.PtExtremite1 == pt2))
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Expert confirmé Avatar de ed73170
    Homme Profil pro
    Développeur indépendant
    Inscrit en
    Mai 2009
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur indépendant

    Informations forums :
    Inscription : Mai 2009
    Messages : 765
    Points : 5 522
    Points
    5 522
    Par défaut
    D'où viennent pt1 et pt2 ?

    Çà ne peut marcher que si pt1 et pt2 sont déjà dans ta liste de vecteurs mais pas si pt1 = new quelquechose et pt2 = new autrechose car la comparaison est faite sur les adresses de pt1 et pt2 et pas sur leur contenu. A moins bien sûr que tu aies redéfini l'opérateur ==.

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut
    ed73170 : pt1 et pt2 sont bien les mêmes. Il s'agit de points déclarés avant et le test se fait avec les mêmes points.

    Pour les tests le crée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                    Point pt1 = new Point("1", 10.0, 10.0);
                    Point pt2 = new Point("2", 0.0, 0.0);
                    Point pt3 = new Point("3", 10.0, 0.0);
    et ce sont toujours pt1, pt2 et pt3 qui sont utilisés, donc il s'agit bien des mêmes points.

    Graffito : Même si je ne comprend pas pourquoi tu proposes ce remplacement, j'ai bien essayé ce que tu m'as proposé mais ça ne donne rien de mieux. Perso, je testais si c.PtExtremite1 égale pt1 ou pt2, et aussi si c.PtExtremite2 égale pt1 ou pt2. Toi tu testes si c.PtExtremite1 vaut pt1 et si c.PtExtremite2 vaut pt2 ou si c.PtExtremite1 vaut pt2 et c.PtExtremite2 vaut pt1, ce qui me semble revenir au même.

    Merci de votre aide à tous les 2. Je ne comprend vraiment pas pq ça me retourne du null alors qu'un élément est bien dans la liste (vérifié par un break).

    voici le code de ma méthode
    PS : Cette méthode se trouve dans public class ListVecteurs<T> : List<Vecteur>, d'où l'utilisation de this
    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
            public Vecteur Find(Point pt1, Point pt2)        {
     
     
                if (this.Count == 0)
                    return null;
                var q = from c in this
                        where ((c.PtExtremite1 == pt1 || c.PtExtremite1 == pt2) && (c.PtExtremite2 == pt1 || c.PtExtremite2 == pt2))
                        select c;
                if (q == null || q.Count() == 0)
                    return null;
                else
                {
                    foreach (var vect in q)
                    {
                        if (vect.GetType() == typeof(Ligne))
                        {
                            Ligne ligne = q as Ligne;
                            return ligne;
                        }
                    }
                    return null;
                }
            }
    Un break sur if (this.Count == 0) m'a permis de vérifier que this contient bien au moins un vecteur contenant les points recherchés, or var q retourne null.
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

  5. #5
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Bizarre, un select ne devrait pas renvoyer null, mais un énumérable vide.

    Au passage, pou tester si il y a un résultat, c'est mieux
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if (q.Any())
    {
     // resultats
    }
    else
    {
    // vide
    }

    Any() n'énumère pas le résultat comme Count et c'est aussi plus clair/concis (a mon avis)
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  6. #6
    Expert confirmé Avatar de ed73170
    Homme Profil pro
    Développeur indépendant
    Inscrit en
    Mai 2009
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur indépendant

    Informations forums :
    Inscription : Mai 2009
    Messages : 765
    Points : 5 522
    Points
    5 522
    Par défaut
    Si tu crées les objets pt1, pt2, et pt3 juste pour les tests alors c'est bien ce que je disais plus haut, tu n'obtiendras aucun résultat car ces points ne sont pas dans ta liste. Je ne sais pas comment tu crées ta liste de vecteurs mais j'imagine que c'est quelque chose comme :

    pta = new Point(...);
    ptb = new Point(...);
    liste.Add(new Vecteur(pta,ptb));

    Si ensuite tu instancies pt1, pt2, pt3 et que tu fais ton select, il est tout à fait normal que le résultat soit vide. Par contre si tu fais ta recherche avec pta et ptb tu obtiendras un résultat. Peu importe que tes points aient les bonnes coordonnées, ce qui compte c'est qu'ils aient le même adresse. Ou bien tu dois surcharger == pour que les tests se fassent sur les données contenues dans les objets Point.

  7. #7
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Pour éviter de selectionner les vecteurs [Pt1,Pt1] et [pt2,Pt2] :

    where
    ((c.PtExtremite1 == pt1 && c.PtExtremite2 == pt2) || (c.PtExtremite2 == pt1 && c.PtExtremite1 == pt2))

    Et comme indiqué par ed73170, remplacer "c.PtExtremitéE == ptP" par "(c.PtExtremitéE.X == ptP.X && c.PtExtremitéE.Y == ptP.Y)"
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut
    Merci à tous pour le temps passé à étudier ma question.

    La simple utilisation de q.any() comme le proposait GuruuMeditation a réglé le problème. Je laisse votre science comprendre pourquoi. Je ne comprend pas pourquoi le remplacement de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
                if (q == null || q.Count() == 0)
                    return null;
                else
                {
                    foreach (var vect in q)
                    {
                        if (vect.GetType() == typeof(Ligne))
                        {
                            Ligne ligne = q as Ligne;
                            return ligne;
                        }
                    }
                    return null;
                }
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
                if (q.Any())
                {
                    foreach (var vect in q)
                    {
                        if (vect.GetType() == typeof(Ligne))
                        {
                            Ligne ligne = q as Ligne;
                            return ligne;
                        }
                    }
                    return null;
                }
                return null;
    règle le problème, mais je dois constater que cela fonctionne.

    Encore merci à tous et à chacun,
    Jean-Marc
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

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

Discussions similaires

  1. Problème pour trouver et copier des données dans un autre workbooks
    Par bilou_12 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/04/2012, 10h23
  2. Trouver des données
    Par openlife dans le forum E-Commerce
    Réponses: 3
    Dernier message: 22/09/2009, 18h59
  3. Trouver des jeux de données
    Par openlife dans le forum Autres
    Réponses: 0
    Dernier message: 22/09/2009, 16h19
  4. Réponses: 2
    Dernier message: 06/05/2007, 18h15
  5. Où trouver des concepteurs de Base de Données?
    Par TomCrouise dans le forum Décisions SGBD
    Réponses: 11
    Dernier message: 13/12/2004, 16h13

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