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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 249
    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

  2. #2
    Expert confirmé 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
    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))

  3. #3
    Membre Expert 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 : 63
    Localisation : France, Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 765
    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 éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 249
    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.

  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 : 50
    Localisation : Belgique

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    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)

  6. #6
    Membre Expert 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 : 63
    Localisation : France, Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 765
    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.

+ 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