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 :

Find() avec predicate sur classe personnalisée


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 60
    Par défaut Find() avec predicate sur classe personnalisée
    Hello world! (je suis sur que personne ne l'avait encore tentée celle la...)

    Je dispose d'une List<> d'une classe personnalisée basique (trois decimaux comme propriétés, rien de plus transcendant).

    Je désire donc faire une recherche sur cette liste à travers mes objets en passant pour paramètres à ma méthode Find() trois décimaux (correspondant chacun à une propriété de mon objet).
    Pouvez-vous me donner un exemple (voire une solution :p) de predicate pour que je m'impregne de cette logique?

    Merci par avance.

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    regardes dans le msdn, les exemples sont "légions"

    The Monz, Toulouse

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 60
    Par défaut
    Si je pose une question aussi basique, c'est parceque je n'ai pas reussit à trouver mon bonheur sur les moteurs de recherche ainsi que la msdn (et meme le sdk...)

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 60
    Par défaut
    Bon... J'aurais fait un Contains à la place tant pis.

  5. #5
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 42
    Par défaut
    Salut!

    Voici un "Finder" générique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Finder<T>
    {
            public static T Find(List<T> list, T obj)
            {
                return list.Find(new Predicate<T>(delegate(T t) { return t.Equals(obj); }));
            }
     }
    L'utilisation donne ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                List<double> list = new List<double>();
                double v = 1;
                list.Add(1);
                list.Add(0);
                list.Add(3);
                double z = Finder<double>.Find(list, v);
    Adapte-le à ton cas en implémentant la bonne méthode Equals qui convient à ta classe à trois attributs


    A+

  6. #6
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    J'ai donné une réponse à ta question dans le forum WinForms.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 60
    Par défaut
    Merci beaucoup, j'en prend note pour les futures utilisations.

  8. #8
    Membre averti
    Profil pro
    DSI
    Inscrit en
    Mars 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : DSI

    Informations forums :
    Inscription : Mars 2006
    Messages : 28
    Par défaut
    Bonjour,

    J'ai préféré poster ici, car mon problème se rapproche de celui discuté dans ce post.

    Il s'agit d'annuler un filtre appliqué sur liste, le code ci-dessous explique tout.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for (int i = 0; i < listSuppliers.Count; i++)
          {
              List<Product> ProductsOfMySupplier = 
                        listProducts.FindAll(delegate(Product) 
                         { return Product.Supp_Id ==  listSuppliers[i].Supp_Id ; });
              listSuppliers[i].Products = ProductsOfMySupplier ;
                  // Il faut ajouter ici quelque chose qui annule
                  // le filtre pour appliquer un autre lors de la prochaine itération
                        
           }
    Merci.

  9. #9
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Il n'y a rien à ajouter à ton code, parce que FindAll ne modifie pas ta liste, elle en renvoie une nouvelle. Tu peux même simplifier ainsi (avec un foreach plutôt qu'un for) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    foreach(Supplier supp in listSuppliers)
          {
              supp.Products = listProducts.FindAll(delegate(Product p) 
                         { return p.Supp_Id ==  supp.Supp_Id ; });                    
           }
    Je suppose que listSuppliers contient des Supplier, si le nom de ta classe est différent, il faut adapter bien sûr

  10. #10
    Membre averti
    Profil pro
    DSI
    Inscrit en
    Mars 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : DSI

    Informations forums :
    Inscription : Mars 2006
    Messages : 28
    Par défaut
    Merci pour votre réponse,

    Le problème que la première itération me renvoie bien la liste attendue, puis plus rien, j'ai supposé qu'il s'agit d'un pb de filtre qui doit être annulé.

    Maintenant, si vous le dites, mon problème doit être ailleurs.

    Merci.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/06/2014, 13h55
  2. Question map avec pointeur sur class.
    Par shirohige dans le forum C++
    Réponses: 7
    Dernier message: 22/11/2013, 09h45
  3. Find() avec predicate sur classe personnalisée
    Par Ivynox dans le forum Windows Forms
    Réponses: 1
    Dernier message: 06/02/2008, 11h21
  4. [VB6] pb avec critère sur find avec rs ADODB
    Par Mymi dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 14/08/2006, 15h45
  5. Problème sur classe Transformer avec les <!--
    Par tykool dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 10/01/2006, 10h20

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