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 :

[c#] comment rechercher une objet dans une LIST<>?


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 33
    Points : 33
    Points
    33
    Par défaut [c#] comment rechercher une objet dans une LIST<>?
    Bonjour tlm,
    j'ai une classe
    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
        public class assiette
        {
            public int numero_assiette;
            public int quantite;
            public string nom;
            public int type;
     
        }
    // je cree une liste d'assiette
     static public List<assiette> LAssietteStock = new List<assiette>();
    // j'ajoute des assiette dans la liste
                    assiette uneAssiette = new assiette();
                    uneAssiette.nom = "Crevette";
                    uneAssiette.numero_assiette =1;
                    uneAssiette.quantite = 2;
                    uneAssiette.type = 1;
    Ma question est dans la liste comment je peux retrouver l'assiette avec nom = "crevette" en utilisant les mehtodes de recheche dans l'objet LIST<>

    j'ai vu une methode "Find" mais j'ai pas compris comment l'utiliser


    Merci d'avance pour l'aide

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 71
    Points : 41
    Points
    41
    Par défaut
    Tu as 2 solutions, la 1er avec Find() :

    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
     
    public class assiette
    {
    	public int numero_assiette;
    	public int quantite;
    	public string nom;
    	public int type;
     
    }
     
    private bool PredicatDeRecherche(assiette a)
    {
    	if (a.nom == "crevette")
    		return true;
    	return false;
    }
     
    // je cree une liste d'assiette
     static public List<assiette> LAssietteStock = new List<assiette>();
    // j'ajoute des assiette dans la liste
    assiette uneAssiette = new assiette();
    uneAssiette.nom = "Crevette";
    uneAssiette.numero_assiette =1;
    uneAssiette.quantite = 2;
    uneAssiette.type = 1;
     
    LAssietteStock.Add(uneAssiette);
     
    assiette assietteCrevette = LAssietteStock.Find(PredicatDeRecherche);
    La 2eme serait de passer par un Enumerator :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    IEnumerator TonEnumerator = LAssietteStock.GetEnumerator();
    while(TonEnumerator.MoveNext())
    {
    	if(TonEnumerator.Current.nom == "crevette")
    		assiettecrevette = TonEnumerator.Current ;
    }

  3. #3
    Membre éclairé
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Points : 777
    Points
    777
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Assiette assiette = MesAssiettes.Find(delegate(Assiette match)
    { return (match.Nom == "Crevette") ;})
    MesAssiettes = List<Assiette>

  4. #4
    Membre actif Avatar de scifire
    Inscrit en
    Juillet 2004
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 226
    Points : 245
    Points
    245
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private bool PredicatDeRecherche(assiette a)
    {
    	return a.nom == "crevette";
    }


    Je crois qu'avec une methode anonyme c'est plus souple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    assiette assietteCrevette = LAssietteStock.Find(delegate(assiette a) { return a.nom == "crevette"; });
    bien sur si on doit faire la recherche beaucoup de fois a des places differentes dans le code c'est mieux d'utiliser la methode PredicatDeRecherche

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 71
    Points : 41
    Points
    41
    Par défaut
    oui c vrai je suis d'accord

  6. #6
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 33
    Points : 33
    Points
    33
    Par défaut
    merci bcp, ca marche nikel ^^

  7. #7
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538
    Par défaut
    Pour le fun, la version LINQ :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Assiette monAssiete = LAssietteStock.First(a => a.nom == "Crevette");

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    En reprenant l'exemple de lykim1982, je voudrais moi utiliser la méthode Find d'une List avec utilisation d'un prédicat, mais dont le critère n'est pas une constante "crevette", mais une variable (que j'ai appellée ici leNomRecherche).

    Comment faire SVP pour lier nomAssiette à LeNomRecherche ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private bool PredicatDeRecherche(assiette a)
    {
    	if (a.nom == leNomRecherche)
    		return true;
    	return false;
    }
     
     
    public Assiette FournirAssietteSelonNom(String nomAssiette)
    {
    	Assiette assiette = LAssietteStock.Find(PredicatDeRecherche);
            return assiette;
    }

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Salut Vincenzo_id,

    le mieux dans ce cas la, et le plus souple comme dit au dessus, c'est d'utiliser les methodes anonymes.

    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
            static void Main(string[] args)
            {
                List<Truc> tList = new List<Truc>();
                string aRechercher = string.Empty;
                Truc match = tList.Find(
                    delegate(Truc t)
                    {
                        return t.S == aRechercher;
                    });
            }
     
    //[...]
     
        class Truc
        {
            public string S;
            public int I;
        }
    L'avantage est que tout est géré par le compilateur (encapsulation des variables etc).

    Si tu ne peux pas utiliser les meth anonymes ou que tu veux faire autremement, tu encapsules toi meme le tout à la mimine :

    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
            static void Main(string[] args)
            {
                List<Truc> tList = new List<Truc>();
                string aRechercher = string.Empty;
                MatchByName m = new MatchByName(aRechercher);
     
                Truc match = tList.Find(m.Match);
            }
     
        class MatchByName
        {
            string m_s;
            public MatchByName(string s)
            {
                m_s = s;
            }
     
            public bool Match(Truc t)
            {
                return t.S == m_s;
            }
        }
    Bref, tu choisis selon ce que tu preferes, mais si tu peux je te conseille lourdement les methodes anonymes, c'est justement dans ce genre d'utilisation qu'elles prennent toutes leurs importances.

  10. #10
    Membre actif Avatar de chris81
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 626
    Points : 298
    Points
    298
    Par défaut
    bonjour,

    voici le code de SirJulio

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            static void Main(string[] args)
            {
                List<Truc> tList = new List<Truc>();
                string aRechercher = string.Empty;
                Truc match = tList.Find(
                    delegate(Truc t)
                    {
                        return t.S == aRechercher;
                    });
            }
     
    //[...]
    ma question que retourne return, un objet, un bool???
    Si je souhaite retourner l'objet que dois je changer ?
    merci

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Le delegate que prend en paramètre la fonction Find est un Predicate<T>, qui est une fonction qui renvoie un booléen pour un T donné. Je ne vois pas bien pourquoi tu voudrais renvoyer l'objet lui-même...

  12. #12
    Membre actif Avatar de chris81
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 626
    Points : 298
    Points
    298
    Par défaut
    ben j'ai besoin de renvoyer l'objet car c'est bien de chercher un objet et de le trouver mais en général si tu le cherche c'est que tu en as besoin pour bosser dessus.

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par chris81 Voir le message
    ben j'ai besoin de renvoyer l'objet car c'est bien de chercher un objet et de le trouver mais en général si tu le cherche c'est que tu en as besoin pour bosser dessus.
    C'est précisément ce que fait Find. Relis la doc, et teste Tu confonds le prédicat, qui est une fonction appelée par la fonction Find, et la fonction Find elle-même.

  14. #14
    Membre actif Avatar de chris81
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 626
    Points : 298
    Points
    298
    Par défaut
    oui tu as raison ++

  15. #15
    Membre actif Avatar de chris81
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 626
    Points : 298
    Points
    298
    Par défaut
    Comment puis je faire pour creer mon predicat general a mon projet pour que je puisse rechercher sur n'importe quelle liste et passer les variables dynamiquement.

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Le post de SirJulio du 26/12 répond à ta question.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/04/2008, 12h14
  2. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48
  3. Réponses: 4
    Dernier message: 19/06/2007, 10h41
  4. Réponses: 8
    Dernier message: 16/02/2007, 15h55
  5. Réponses: 7
    Dernier message: 21/08/2006, 16h27

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