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 :

rechercher dans une List<Maclass> si une partie de MaClass est égale


Sujet :

C#

  1. #1
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 937
    Points : 2 018
    Points
    2 018
    Par défaut rechercher dans une List<Maclass> si une partie de MaClass est égale
    bonjour

    Je cherche à tester ceci
    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
     
     
    public class Element
    {
     public int IDSuivi { get; set; }
     public int Avancement{ get; set; }
    }
     
    List<Element> ListElements = new List<Element>() ;
     
    a chaque reception
    {
     Element RetourRecu = new Element();
     RetourRecu.IDSuivi = IDrecu ;
     RetourRecu.Avancement = Avancementrecu;
     
    // Y a t-il dans la liste "ListElements" un élément dont Element.IDsuivi = RetourRecu.IDSuivi
    }
    Y a t-il dans la liste "ListElements" un élément dont Element.IDsuivi = RetourRecu.IDSuivi ?

    J'arrive bien entendu à faire ca avec une vilaine boucle for mais je me dis qu'il y a surement bien plus joli...
    Je pensais à List.contains au départ mais cela sous entend que je cherche à vérifier l'egalité sur "IDSuivi" et "Avancement" en même temps or je me fiche de Avancement dans cette recherche !

    IDsuivi est une sorte d'index dans mon cas. Je cherche a me repositionner dans la liste pour mettre à jour Avancement justement.

    Merci par avance pour vos lumières
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  2. #2
    Membre chevronné
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 640
    Points : 2 149
    Points
    2 149
    Par défaut
    Salut,

    avec Linq tu peux faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Element element = listElements.Find(ele => ele.IDsuivi == RetourRecu.IDSuivi);
    Ca te retournera l'élément qui correspond a la condition.

  3. #3
    Membre éprouvé Avatar de Momoth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 318
    Points : 1 236
    Points
    1 236
    Par défaut
    Bonjour,

    Je te conseil également d'utiliser Linq. Après la méthode utilisée dépendra des différents cas qui peuvent arriver. Find() levera une exception si jamais aucun élément ne correspond a la restriction. Comme tu veux tester la présence d'un élément dans ta liste, je te conseil plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (listElements.Where(ele => ele.IDsuivi == RetourRecu.IDsuivi).Count() > 0) {}
    qui testera si il y'a des éléments dans ta liste qui ont cet ID.

    Bonne journée.

    -- Momoth --
    La Triforce du développement : Fainéantise, Curiosité et Imagination.

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Points : 502
    Points
    502
    Par défaut
    La façon la plus efficace:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bool existe = maListe.Any(x => x.Property.Equals(maCondition));

  5. #5
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 937
    Points : 2 018
    Points
    2 018
    Par défaut
    Bonjour et merci pour les réponses, c'est effectivement bien plus beau qu'avec un for...

    j'ai fait ceci (j'ai changé les noms pour les rendre plus en phase avec mon appli)
    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
     
    public class TacheSuivi
    {
     public int IDtache { get; set; }
     public int AvancementTache { get; set; }
    }
     
    TacheSuivi RetourRecu = new TacheSuivi();
    RetourRecu.IDtache = IdRecu ;
    RetourRecu.AvancementTache = AvancementRecu;
     
    if (ListAvancementTaches.Where(ele => ele.IDtache == RetourRecu.IDtache).Count() > 0)
    {
     TacheSuivi AvancementAmodifier = new TacheSuivi();
     AvancementAmodifier = ListAvancementTaches.Where(ele => ele.IDtache == RetourRecu.IDtache).First() ;
     AvancementAmodifier.AvancementTache = RetourRecu.AvancementTache;
    }
    else 
    {
      ListAvancementTaches.Add(RetourRecu); // il n'existe pas encore, ajout.
    }
    Cela semble faire le job mais je m'inquiète juste de faire appel 2 fois au calcul de "ListAvancementTaches.Where(ele => ele.IDtache == RetourRecu.IDtache)"

    peut mieux faire ?

    Merci
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  6. #6
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 937
    Points : 2 018
    Points
    2 018
    Par défaut
    Je précise que j'ai très peu de choses dans la liste
    La plupart du temps il y en aura entre 1 et 4 et au grand maximum une 20n en gros
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  7. #7
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Je propose ceci :
    Code c# : 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
    public class TacheSuivi
    {
     public int IDtache { get; set; }
     public int AvancementTache { get; set; }
    }
     
    TacheSuivi RetourRecu = new TacheSuivi();
    RetourRecu.IDtache = IdRecu ;
    RetourRecu.AvancementTache = AvancementRecu;
    
    // >>>ICI<<<, pour ceux qui n'aurait pas bien lu, il y a qu'UN seul parcours de l'énumération
    var AvancementAmodifier = ListAvancementTaches.FirstOrDefault(ele => ele.IDtache == RetourRecu.IDtache) ;
    if (AvancementAmodifier != null)
    {
     AvancementAmodifier.AvancementTache = RetourRecu.AvancementTache;
    }
    else 
    {
      ListAvancementTaches.Add(RetourRecu); // il n'existe pas encore, ajout.
    }
    "Si vous voulez être l’esclave des banques et payer pour financer votre propre esclavage, alors laissez les banquiers créer la monnaie" - Josiah Stamp, 1920, Gouverneur de la Banque d’Angleterre
    "Qui ne peut acheter ruine qui voudrait vendre" - Jacques Duboin.
    "Nous n'héritons pas la terre de nos parents, nous l'empruntons à nos enfants." - Antoine de Saint Exupéry

  8. #8
    Membre averti Avatar de pascalCH
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Juillet 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 187
    Points : 369
    Points
    369
    Par défaut Peux mieux faire
    Pour éviter de faire deux fois l'appel à la requête, une méthode consiste à récupérer dans une variable locale à la fonction le résultat et de vérifier si il est null ou pas ce qui donne ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
                TacheSuivi locale = ListAvancementTaches.FirstOrDefault( x=> x.IDtache==RetourRecu.IDtache);
                if (locale != null)
                {
                    TacheSuivi AvancementAmodifier = new TacheSuivi();
                    AvancementAmodifier = ListAvancementTaches.Where(ele => ele.IDtache == RetourRecu.IDtache).First();
                    AvancementAmodifier.AvancementTache = RetourRecu.AvancementTache;
                }
                else
                {
                    ListAvancementTaches.Add(RetourRecu); // il n'existe pas encore, ajout.
                }
    Même si il n'y a que quelques éléments dans la liste, ça vaudra le coup
    La nature fait des choses extraordinaires, observons la et restons humble, on ne nous demande pas de refaire le monde mais juste de reproduire virtuellement des choses existantes ....

    et n'oubliez pas si vous aimez et quand vous avez la réponse

  9. #9
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 937
    Points : 2 018
    Points
    2 018
    Par défaut
    punaise j'ai bien fait de poser la question !

    J'ai appris pleins de choses

    Merci
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  10. #10
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Sans vouloir faire le rabat-joie, même si en théorie pascalCH a raison, son code n'applique pas sa propre théorie (la variable "locale" est juste utilisée pour le teste, mais de nouveau un parcours de l'énumération est refaite (avec le where)).
    Ceci dit, si vous lisez attentivement ce j'ai proposé, vous constaterez que l'énumération est réellement parcourue qu'une seule fois.
    "Si vous voulez être l’esclave des banques et payer pour financer votre propre esclavage, alors laissez les banquiers créer la monnaie" - Josiah Stamp, 1920, Gouverneur de la Banque d’Angleterre
    "Qui ne peut acheter ruine qui voudrait vendre" - Jacques Duboin.
    "Nous n'héritons pas la terre de nos parents, nous l'empruntons à nos enfants." - Antoine de Saint Exupéry

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/01/2015, 12h14
  2. Macro de recherche dans une liste de mots à partir d'une DataBase
    Par Xorck dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 18/11/2014, 16h26
  3. Réponses: 1
    Dernier message: 11/07/2014, 08h58
  4. Réponses: 0
    Dernier message: 01/09/2012, 16h42
  5. Réponses: 3
    Dernier message: 14/08/2012, 10h24

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