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 si une partie de string est present


Sujet :

VB.NET

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut chercher si une partie de string est present
    Bonsoir, je vous explique mon soucis, j'ai une fonction qui prend comme paramètre une adresse et j'ai une collection de string qui contient une partie de ces adresses, ainsi voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function search_adrese_exact(ByVal adr As String)
            Dim val_retour As String = adr
            For Each mot As String In myCol
                If mot.Contains(adr) Then
                    Dim tab_mot As String() = mot.Split("##")
                    val_retour = tab_mot(1)
                End If
            Next
            Return val_retour
        End Function
    Bien avant je rempli ma collection avec les éléments suivants par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        Public Sub chargement_des_adresses()
            myCol.Add("DISCOTHEQUE LE QUEEN##21 rue des champs Elysée")
            myCol.Add("RESTAURANT LE RITZ##63 place Vendôme")
    End Sub
    Mon but est de lorsque je pense en paramètre de search_adrese_exact() la chaîne 'DISCOTHEQUE LE QUEEN (établissement de nuit)' la fonction me retourne 21 rue des champs Elysée !
    J'ai constaté en déboguant pas a pas que l'on boucle bien sur tout les éléments de ma collection myCol mais lorsque l'on passe sur l'élément concerné en dirait que le programme ne sélectionne pas l'item car il ne porte pas exactement le meme nom ( a savoir que dans le paramètre il y a établissement de nuit en plus)

    Je me demande si c'est le Contains qui ne convient pas ou ma fonction comporte une erreur ? merci d'avance

  2. #2
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2013
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 235
    Points : 359
    Points
    359
    Par défaut
    Bonjour,

    J'ai pas bien compris le problème (s'il y en a un)...
    Tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim tab_mot As String() = mot.Split("##")
    val_retour = tab_mot(1)
    Le '1' du tab_mot correspond à la seconde occurrence du string, si tu veux la première il faut mettre '0'
    Je ne sais pas en quelle version de VB tu travailles mais voici un exemple en .net 2010:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim St As String = "AAA#BBB#CCC"
            MessageBox.Show(OccurrenceNumero(St, 0))
            MessageBox.Show(OccurrenceNumero(St, 1))
            MessageBox.Show(OccurrenceNumero(St, 2))
        End Sub
     
        Private Function OccurrenceNumero(ByVal Texte As String, ByVal Numero As Integer) As String
            Dim Str As String = Texte.Split("#"c)(Numero)
            Return Str
        End Function

  3. #3
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    Oui je souhaite que ça soit la deuxième partie situé après ## qui soit retourné par la fonction.
    Le soucis est que dans la boucle il ne trouve jamais la coincidence entre là chaîne passé en paramètre et les valeur de la collection.
    mais j'ai essayé en enlevant les ## et l'adresse derrière et la ça fonctionne.
    Donc en faite .contains ou .startwith ne détecte pas que les chaînes sont identiques !
    Dois je faire deux tableaux un contenant le paramètre exact mot pour mot et l'autre contenant l'adresse ?

  4. #4
    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
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,
    La méthode split attend un tableau de caractères comme séparateur.
    Pour utiliser un tableau de chaîne de caractère il faut utiliser la méthode surchargée String.Split avec comme paramètre (String(), StringSplitOptions)
    La méthode s'utilisera ainsi (avec une seule chaîne de caractère dans notre tableau, il y aurait pu en avoir plusieurs chaîne de caractère comme délimiteurs {"##","//","??"})
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Private stringSeparators() As String = {"##"} ' pour bien définir le type
        Function search_adrese_exact(ByVal adr As String)
            For Each mot As String In myCol
                If mot.Contains(adr) Then Return mot.Split(stringSeparators, StringSplitOptions.None)(1)
            Next
            Return adr
        End Function
    Ex sur un form avec un bouton
    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
    Public Class Form1
     
        Dim myCol As List(Of String) = New List(Of String)
     
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            chargement_des_adresses()
        End Sub
     
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            MessageBox.Show(search_adrese_exact("DISCOTHEQUE LE QUEEN"))
        End Sub
     
        Public Sub chargement_des_adresses()
            myCol.Add("DISCOTHEQUE LE QUEEN##21 rue des champs Elysée")
            myCol.Add("RESTAURANT LE RITZ##63 place Vendôme")
        End Sub
     
        Private stringSeparators() As String = {"##"} ' pour bien définir le type
        Function search_adrese_exact(ByVal adr As String)
            For Each mot As String In myCol
                If mot.Contains(adr) Then Return mot.Split(stringSeparators, StringSplitOptions.None)(1)
            Next
            Return adr
        End Function
     
    End Class
    Sinon l'utilisation de classes pour les données est plus propre.

  5. #5
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    Merci pour ton aide rv26t, je ne savait pas qu'il fallait utiliser la méthode surchargé string.split
    Et par contre tu parle de l'utilisation de classes pour les données. Aurais tu plus d'info ou un liens explicatif. Ca m'intéresserais.
    Merci encore

  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
    Points : 5 100
    Points
    5 100
    Par défaut
    Il existe plusieurs solutions.

    Pour faire très simple dans ton cas avec juste 2 données "Nom", "Adresse", tu peux utiliser un dictionnaire.

    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 DicoEtablissement As Dictionary(Of String, String) = New Dictionary(Of String, String)
     
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            chargement_des_adresses()
        End Sub
     
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            MessageBox.Show(DicoEtablissement("DISCOTHEQUE LE QUEEN"))
        End Sub
     
        Public Sub chargement_des_adresses()
            DicoEtablissement.Add("DISCOTHEQUE LE QUEEN", "21 rue des champs Elysée")
            DicoEtablissement.Add("RESTAURANT LE RITZ", "63 place Vendôme")
        End Sub
    Comme tu peux le constater c'est très simple. Mais peu évolutif.

    L'utilisation de classes va te permettre de gérer tes données de façons plus évolutive.
    Un petit exemple très simplifié pour appréhender les classes.
    Imaginons que tu veuilles aussi la ville, tu crès une classe de base avec tes données.
    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
    Public Class clsEtablissement
     
        Public Property Nom As String
        Public Property Adresse As String
        Public Property Ville As String
     
        Public Sub New(n As String, a As String, v As String)
            Nom = n
            Adresse = a
            Ville = v
        End Sub
        Public Sub New(n As String, a As String)
            Nom = n
            Adresse = a
            Ville = ""
        End Sub
    End Class
    Tu pourrais traiter directement cette classe avec une collection, mais il vaut mieux utiliser une classe gérant la liste des établissements.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Class clsEtablissements
        Property ColEtabs As List(Of clsEtablissement) = New List(Of clsEtablissement)
     
        ''' <summary>Retrouve une adresse en fonction du nom de l'établissement</summary>
        ''' <param name="Nom">Nom de l'établissement</param>
        ''' <returns>L'adresse, ou le nom si non trouvé</returns>
        Function GetAdresse(Nom As String) As String
            For Each Etabl As clsEtablissement In ColEtabs
                If Etabl.Nom = Nom Then Return Etabl.Adresse
            Next
            Return Nom
        End Function
     
    End Class
    Dans cette classe tu peux rajouter toutes les fonctionnalités nécessaires à la manipulation des établissements.
    Tout est centralisé et autonome. (données + méthodes)

    Utilisation
    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 Form1
     
        Property Etablissements As clsEtablissements = New clsEtablissements
     
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            chargement_des_adresses()
        End Sub
     
        Public Sub chargement_des_adresses()
            Etablissements.ColEtabs.Add(New clsEtablissement("DISCOTHEQUE LE QUEEN", "21 rue des champs Elysée", "Paris"))
            Etablissements.ColEtabs.Add(New clsEtablissement("RESTAURANT LE RITZ", "63 place Vendôme"))
        End Sub
     
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            MessageBox.Show(Etablissements.GetAdresse("DISCOTHEQUE LE QUEEN"))
        End Sub
     
    End Class
    Comme tu peux le voir, dans form, tu ne te soucis plus du fonctionnel, tu utilises suivant tes besoins.

    Tu peux ainsi ajouter toutes les fonctionnalités que tu veux à ta classe, et utiliser celles dont tu as besoin aux endroits voulus.

  7. #7
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    pas mal, merci bien pour l'explication

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

Discussions similaires

  1. [Débutant] Condition IF qui verifie si un string est present dans une list
    Par harghan dans le forum C#
    Réponses: 6
    Dernier message: 13/05/2014, 15h28
  2. [Smarty] Seul une partie du code est affichée
    Par euclid dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 15/10/2009, 20h47
  3. [AC-2003] Fermer une application dont seul une partie du titre est connu
    Par Miss Ti dans le forum VBA Access
    Réponses: 1
    Dernier message: 10/06/2009, 23h53
  4. problème de sélection d'une partie de string
    Par babou466 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/02/2009, 18h04
  5. Réponses: 1
    Dernier message: 29/03/2007, 14h46

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