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

VB.NET Discussion :

Problème de logique de recherche (le retour)


Sujet :

VB.NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    octobre 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2004
    Messages : 162
    Points : 94
    Points
    94
    Par défaut Problème de logique de recherche (le retour)
    Bonjour,

    J'aimerai avoir vos avis sur le code suivant, ne maîtrisant pas encore les subtilités de LINQ:

    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
    30
    31
    32
    33
    34
    35
     Dim Ecole As New Dictionary(Of String, List(Of cEleve))
     
            Dim sats As New List(Of cEleve)
            sats.Add(New cEleve With {.nom = "Luc", .age = 5})
            sats.Add(New cEleve With {.nom = "Pierre", .age = 4})
            sats.Add(New cEleve With {.nom = "Michel", .age = 4})
            Ecole.Add("CM1A", sats)
     
            sats = New List(Of cEleve)
            sats.Add(New cEleve With {.nom = "Anne", .age = 6})
            sats.Add(New cEleve With {.nom = "Louis", .age = 5})
            Ecole.Add("CM1B", sats)
     
            sats = New List(Of cEleve)
            sats.Add(New cEleve With {.nom = "Lucie", .age = 3})
            sats.Add(New cEleve With {.nom = "Vally", .age = 3})
            Ecole.Add("CE2A", sats)
     
            Dim sRecherche As String = "Pierre"
     
            'lourd mais ça fonctionne....
            Dim Eleve As cEleve = Ecole.Values.First(Function(x) x.Exists(Function(k) k.nom = sRecherche)).First(Function(y) y.nom = sRecherche)
     
            If Not IsNothing(Eleve) then 
                Dim sClasse As String = Ecole.First(Function(x) x.Value.Exists(Function(k) k.nom = sEleve)).Key
                MsgBox(Eleve.nom & " a " & Eleve.age & " ans et est en classe de " & sClasse)
            End If
     
        End Sub
    End Class
     
    Public Class cEleve
        Public Property nom As String
        Public Property age As Integer
    End Class
    La méthode pour trouver le cEleve("Pierre") fonctionne mais me semble "chargée". Y-a-t'il plus "propre" ou bien ai-je la bonne soluce?


    Merci de vos avis

    Olivier

  2. #2
    Membre éprouvé Avatar de Phil Rob
    Homme Profil pro
    Enseignant
    Inscrit en
    novembre 2013
    Messages
    663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : novembre 2013
    Messages : 663
    Points : 1 118
    Points
    1 118
    Par défaut
    Bonsoir,

    Je ne sais pas si ça va dans le sens de ce que tu cherches ...

    Peut-être devrais-tu t'intéresser à la propriété Contains des collections, dont la List(Of ...), la Dictionnary(Of ...), ...

    Tu devrais pouvoir programmer des recherches facilement avec quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If MaVariableDeTypeListOf.Contains("ce que je cherche") Then 
    ' Trouvé
    Else
    ' Non trouvé
    J'espère que ceci te donnera une bonne idée ...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    octobre 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2004
    Messages : 162
    Points : 94
    Points
    94
    Par défaut
    Ben non pas vraiment. Le contains va me renvoyer en quelque sorte un booléen pour dire "oui j'existe" mais ne me renvoie pas la référence remplissant le critère.
    Pour parler le langage de Villani, je veux faire y=f(x) où x est une propriété de la classe de y, à chercher dans les Values d'un Dictionnary.

    L'instruction LINQ que j'utilise marche bien mais je me demandais si elle pouvait être simplifiée.

    Merci de ton intérêt en tous cas .

    Olivier

  4. #4
    Membre à l'essai
    Homme Profil pro
    Formateur
    Inscrit en
    juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Formateur
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2011
    Messages : 6
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    Je pense qu'il faut repenser ta structure. Je te joins un exemple avec un héritage de Collection (Ecole-Classes) et une liste interne (Classe-Elèves).


    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
     
    Sub Main()
     
            ' Création de l'école
            Dim ecole = New EcoleCollection()
            ecole.Nom = "Ecole Jacques Prevert"
     
            ' Création d'une classe
            Dim classe1 = New Classe()
            classe1.Nom = "CM1A"
            classe1.AjouterEleve("Luc", 5)
            classe1.AjouterEleve("Pierre", 4)
            classe1.AjouterEleve("Michel", 4)
            ecole.Add(classe1)
     
            classe1 = New Classe()
            classe1.Nom = "CM1B"
            classe1.AjouterEleve("Anne", 6)
            classe1.AjouterEleve("Louis", 5)
            ecole.Add(classe1)
     
            classe1 = New Classe()
            classe1.Nom = "CE2A"
            classe1.AjouterEleve("Lucie", 3)
            classe1.AjouterEleve("Vally", 3)
            ecole.Add(classe1)
     
            Dim recherche = "Pierre"
            Dim classeRecherche As Classe = Nothing
            Dim eleveRecherche As Eleve = Nothing
     
            'Requete à adapter si besoin pour retrouver plusieur élève avec le même nom - Where au lieu de First -
            For Each classe In ecole
                Dim eleve = classe.Eleves.First(Function(eleveLambda) eleveLambda.Nom = recherche)
                If eleve Is Nothing Then Continue For
                eleveRecherche = eleve
                classeRecherche = classe
                Exit For
            Next
     
            Console.WriteLine($"{eleveRecherche?.Nom} a {eleveRecherche?.Age} ans et est en classe de {classeRecherche?.Nom}")
        End Sub
     
     
        Class EcoleCollection
            Inherits Collection(Of Classe)
     
            Public Property Nom As String
        End Class
     
        Class Eleve
            Public Property Nom As String
            Public Property Age As Integer
        End Class
     
        Class Classe
            Public Sub New()
                Eleves = New List(Of Eleve)()
            End Sub
     
            Public Property Nom As String
            Public Property Eleves As List(Of Eleve)
     
            Public Sub AjouterEleve(eleve As Eleve)
                Eleves.Add(eleve)
            End Sub
     
            Public Sub AjouterEleve(nom As String, age As Integer)
                Eleves.Add(New Eleve With {
                              .Age = age,
                              .Nom = nom
                              })
            End Sub
        End Class
    En espérant t'avoir aidé.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    octobre 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2004
    Messages : 162
    Points : 94
    Points
    94
    Par défaut
    Oui ma structure était simplifiée pour l'exemple mais la solution recherchée était de s'affranchir de tout "For Each" comme tu suggères.

    Merci quand même

  6. #6
    Membre à l'essai
    Homme Profil pro
    Formateur
    Inscrit en
    juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Formateur
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2011
    Messages : 6
    Points : 14
    Points
    14
    Par défaut
    S'affranchir de tout ForEach, pour quelles raisons ?


    Une requête Linq est une boucle ForEach tout simplement écrite différemment.

Discussions similaires

  1. Problème de logique de recherche
    Par zitoune92 dans le forum VB.NET
    Réponses: 1
    Dernier message: 26/09/2019, 14h44
  2. [XL-2010] Problème de fonctions imbriquées (recherche V+ logique)
    Par stargate2370 dans le forum Excel
    Réponses: 4
    Dernier message: 15/11/2012, 14h25
  3. Réponses: 11
    Dernier message: 24/10/2005, 17h02
  4. problème avec résultat de recherche multi-critères
    Par audrey_desgres dans le forum Access
    Réponses: 2
    Dernier message: 23/06/2005, 11h00
  5. problème avec moteur de recherche
    Par allyson dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 16/02/2005, 16h23

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