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

VB.NET Discussion :

Chercher dans une Collection [Débutant]


Sujet :

VB.NET

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 134
    Par défaut Chercher dans une Collection
    Bonjour à tous,

    Après avoir passé des heures sur ce problème, je n'ai toujours pas compris comment faire.

    Prenons l'exemple du cours de Philipe, soit :

    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
    'List de String contenant des noms d'animeaux
    Dim Animals As New List(Of String) From {"Compsognathus", _
                "Amargasaurus", "Oviraptor", "Velociraptor", _
                "Deinonychus", "Dilophosaurus", "Gallimimus", _
                "Triceratops"}
     
    Dim listResult As List(Of String) = Animals.FindAll(AddressOf SeTermineParUS) 
     
    ' Voici la fonction de test, le Predicat. 
     
    Private Shared Function SeTermineParUS (ByVal s As String) As Boolean 
     
    If (s.Length > 2) AndAlso  (s.Substring(s.Length - 2).ToLower() = "lu") Then
         Return True 
    Else 
        Return False 
    End If 
     
    End Function

    L'exemple est très compréhensif et j'arrive très bien à l'appliquer. Cependant comment ajouter une variable à la place de "lu" à ma fonction (paramètres).

    Soit l'exemple :

    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
    'List de String contenant des noms d'animeaux
    Dim Animals As New List(Of String) From {"Compsognathus", _
                "Amargasaurus", "Oviraptor", "Velociraptor", _
                "Deinonychus", "Dilophosaurus", "Gallimimus", _
                "Triceratops"}
     
    Dim listResult As List(Of String) = Animals.FindAll(AddressOf SeTermineParUS) 
     
    ' Voici la fonction de test, le Predicat. 
     
    Private Shared Function SeTermineParUS (ByVal s As String, MotClefs as string) As Boolean 
     
    If (s.Length > 2) AndAlso  (s.Substring(s.Length - 2).ToLower() = MotClefs) Then
         Return True 
    Else 
        Return False 
    End If 
     
    End Function
    Et là, je plante..... et je sais pourquoi, mais je ne sais pas le corriger.

    Si quelqu'un peu m'apporter de l'aide sur ce problème, ce serai très aimable.

    Merci à tous...

  2. #2
    Membre émérite Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Par défaut
    Salut,

    Je ne pense pas que tu puisse passer de paramètre de cette façon..
    Tu pourrais par exemple déclarer MotClefs en variable globale ou bien faire ta propre fonction..

    variable globale:
    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
        Dim MotClefs As String = ""
     
        Sub Test()
            'List de String contenant des noms d'animeaux
            Dim Animals As New List(Of String) From {"Compsognathus", _
                        "Amargasaurus", "Oviraptor", "Velociraptor", _
                        "Deinonychus", "Dilophosaurus", "Gallimimus", _
                        "Triceratops"}
     
            MotClefs = "lu"
            Dim listResult As List(Of String) = Animals.FindAll(AddressOf SeTermineParUS)
        End Sub
     
        Private Function SeTermineParUS(ByVal s As String) As Boolean
     
            Return s.EndsWith(MotClefs)
     
        End Function
    fonction personnalisée:
    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
        Sub Test()
            'List de String contenant des noms d'animeaux
            Dim Animals As New List(Of String) From {"Compsognathus", _
                        "Amargasaurus", "Oviraptor", "Velociraptor", _
                        "Deinonychus", "Dilophosaurus", "Gallimimus", _
                        "Triceratops"}
     
            Dim listResult As List(Of String) = ChercheTerminaison(Animals, "lu")
        End Sub
     
        Private Function ChercheTerminaison(ByVal inputList As List(Of String), ByVal s As String) As List(Of String)
            ChercheTerminaison = New List(Of String)
     
            For Each item As String In inputList
                If item.EndsWith(s) Then
                    ChercheTerminaison.Add(item)
                End If
            Next
     
        End Function

  3. #3
    Membre émérite Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Par défaut
    Ou alors créer ta propre classe héritée de List pour y mettre ta fonction personnalisée..
    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
    Module Module1
     
        Sub Main()
     
            'List de String contenant des noms d'animeaux
            Dim Animals As New MyOwnStringList({"Compsognathus", _
                        "Amargasaurus", "Oviraptor", "Velociraptor", _
                        "Deinonychus", "Dilophosaurus", "Gallimimus", _
                        "Triceratops"})
     
            Dim listResult As List(Of String) = Animals.FindAllByTerminaison("or")
        End Sub
     
    End Module
     
    Public Class MyOwnStringList
        Inherits Generic.List(Of String)
     
        Private term As String = ""
     
        Sub New()
            MyBase.New()
        End Sub
     
        Sub New(ByVal arr As String())
            MyBase.New(arr)
        End Sub
     
        Public Function FindAllByTerminaison(ByVal term As String) As List(Of String)
            Me.term = term
            Return MyBase.FindAll(AddressOf MyFunc)
        End Function
     
        Private Function MyFunc(ByVal s As String) As Boolean
            Return s.EndsWith(Me.term)
        End Function
    End Class

  4. #4
    Membre émérite

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Par défaut
    Salut

    peut etre comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     Private Shared Function SeTerminePar(ByVal s As String, ByVal MotClefs As String) As Boolean
     
            If (s.Length > MotClefs.Length) AndAlso (s.Substring(s.Length - MotClefs.Length) = MotClefs) Then
                Return True
            Else
                Return False
            End If
     
        End Function

  5. #5
    Membre émérite Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Par défaut
    Citation Envoyé par shayw Voir le message
    peut etre comme ça
    Le probleme c'est que l'on ne peut pas passer de parametre de cette facon..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Animals.FindAll(AddressOf SeTerminePar)  'parametre??

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Par défaut
    Bonjour,

    En créant une classe qui englobe ta méthode
    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
    Class Selection
        ' champ qui contiendra le critère de comparaison
        Private sMotClefs As String = "valeur par défaut"
        ' constructeur avec paramètre
        Sub New(ByVal sUnMotClefs As String)
            sMotClefs = sUnMotClefs
        End Sub
        ' la méthode de recherche
        Public Function SeTermineParMotClefs(ByVal s As String) As Boolean
            If (s.Length > 2) AndAlso (s.Substring(s.Length - 2).ToLower() = sMotClefs) Then
                Return True
            Else
                Return False
            End If
        End Function
    End Class
     
    ' non présent mais pourrait être utile suivant les besoins en cas de création antérieure à l'utilisation
    'propriété
    '    Public Property MotClefs() As String
    '        Get
    '            Return sMotClefs
    '        End Get
    '        Set(ByVal value As String)
    '            sMotClefs = value
    '        End Set
    '    End Property
     
    ' constructeur de base
    '    Sub New()
    '    End Sub
    Ensuite tu appeles ta méthode en créant l'instance de ta classe qui reçoit un paramètre pour le constructeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            'List de String contenant des noms d'animeaux
            Dim Animals As New List(Of String) From {"Compsognathus", _
                        "Amargasaurus", "Oviraptor", "Velociraptor", _
                        "Deinonychus", "Dilophosaurus", "Gallimimus", _
                        "Triceratops"}
            ' appel méthode de recherche, on passe le paramètre en création de l'instance de la classe et on éxecute la méthode de sélection qui restreindra la liste
            Dim listResult As List(Of String) = Animals.FindAll(AddressOf (New Selection("us")).SeTermineParMotClefs)
    A+, Hervé.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 134
    Par défaut
    Tout d'abord je tiens à vous remercier pour toutes vos propositions, cela m'a permis de trouver la solution.

    Voici la solution :

    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
    Public Class Class_ListeDesAbsences
     
        Private Shared _IdDuMarin As Guid
        Private Shared _ToStringAbsence As String
     
        Private _LaCollection As List(Of Class_Absences)
     
     
        ' Initialise et Charge la Collection
        Public Sub New()
            _LaCollection = New List(Of Class_Absences)
            load()
        End Sub
     
        ' Supprime toutes les Absences d'un Marin spécifié par ID 
        Public Sub RemoveAll(ByVal Id As Guid)
            _IdDuMarin = Id
            _LaCollection.RemoveAll(AddressOf FCT_IdentifieUneAbsencePrecise_ID)
        End Sub
     
        ' Renvoie toutes les Absence d'un Marin spécifié par son ID
        Public Function Get_AbsenceAll(ByVal Id As Guid) As List(Of Class_Absences)
            _IdDuMarin = Id
            Return _LaCollection.FindAll(AddressOf FCT_IdentifieUneAbsencePrecise_ID)
        End Function
     
     
        ' Retourne VRAI quand l'ID d'une Absence est identique à l'ID transmit
        Private Function FCT_IdentifieUneAbsencePrecise_ID(ByVal UneAbsence As Class_Absences) As Boolean
            If UneAbsence.Id = _IdDuMarin Then
                Return True
            Else
                Return False
            End If
        End Function
     
    End Class

    Comme on peut le voir, j'ai créé une Variable Privé propre à la classe que je me sert dans ma function de Predicat.

    Merci à tous...

    PS : désolé de ne pas avoir répondu plus tôt.

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

Discussions similaires

  1. [VB.NET] Suppression d'objets dans une collection
    Par master56 dans le forum VB.NET
    Réponses: 7
    Dernier message: 03/06/2010, 21h46
  2. Réponses: 3
    Dernier message: 21/07/2008, 09h49
  3. Réponses: 8
    Dernier message: 03/02/2006, 15h15
  4. [PL/SQL] Charger une table dans une collection
    Par nosnoss dans le forum Oracle
    Réponses: 10
    Dernier message: 03/03/2005, 17h56
  5. Controle dans une collection
    Par rolototo dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 07/02/2005, 14h12

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