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 :

Tester si un string est contenu dans un autre


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 159
    Points : 77
    Points
    77
    Par défaut Tester si un string est contenu dans un autre
    Bonjour,

    Mon but controler si un string contient un mot d'une liste XML et j'avoue ne pas trop savoir comment procéder.

    Exemple:

    AIDA BIZ Consulting SA

    mon XML:
    Code XML : 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
    <Root>
    <Item>AEA</Item>
    <Item>AEE<Item>
    <Item>AELE<Item>
    <Item>AELS<Item>
    <Item>AID<Item>
    <Item>AIEA<Item>
    <Item>AIPO<Item>
    <Item>ALADI<Item>
    <Item>ALALC<Item>
    <Item>ALALE<Item>
    <Item>AMAGE<Item>
    <Item>AMPO<Item>
    <Item>APEC<Item>
    <Item>APPA<Item>
    <Item>ARABSAT<Item>
    <Item>BBDM<Item>
    <Item>BIZ<Item>
    </Root>

    Donc la j'aimerais qu'on me signale BIZ et pas AID car c'est AIDA.

    Je pensais faire ca avec un ArrayList et tester avec un contains mais es-ce que c'est le meilleur moyen?

    Merci

    Thierry

  2. #2
    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
    Et si tu cherchais la chaîne ">AIDA<" ? Je sais que c'est moche, mais ça dépend de ton besoin et de ton projet. Si tu as un certain nombre de manips à faire sur du xml, autant le désérialiser dans une classe qui va bien, qui contiendrait en l'occurence une List<string> remplie avec les Item. Si c'est un besoin ponctuel, ma solution, doit suffire. Et les expressions régulières peuvent bien aider également.

  3. #3
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Avec un XmlDocument, tu charges ton XML et tu le lis noeud par noeud pour faire un test de comparaison.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 159
    Points : 77
    Points
    77
    Par défaut
    Bonjour,

    Merci pour vos réponse

    Et si tu cherchais la chaîne ">AIDA<" ? Je sais que c'est moche, mais ça dépend de ton besoin et de ton projet.
    Je comprends pas ce que tu veux dire a part si tu parle des caractère spéciaux <> ben on peut très bien utiliser & lt ; et & gt ;.

    Sinon tous dépend des Item contenu dans le XML aujourd'hui AIDA n'y est pas mais demain on pourrait décider de le rajouter.

    Citation Envoyé par Thomas Lebrun Voir le message
    Avec un XmlDocument, tu charges ton XML et tu le lis noeud par noeud pour faire un test de comparaison.
    Oui donc je dois de faire une requête xpath pour chaque mot:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (test.selectsinglenode("/Root[Item='AIDA'])!=null)
    if (test.selectsinglenode("/Root[Item='BIZ'])!=null)
    if (test.selectsinglenode("/Root[Item='Consulting'])!=null)
    ....
    Le but est de savoir quelle mot est dans la liste et le mentionné à l'utilisateur. En faite, c'est une blacklist si un mot se retrouve dans le texte je dois le signaler a mon utilisateur car il est interdit.

    Donc si je suis bien, je contruis une List<string> et je boucle dessus (for) en faisant a chaque fois un selectsinglenode?

    Mais ca va le faire si je dois controler 50 string avec avec ma blacklist qui contient environ 100 Item?

    Merci

  5. #5
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par totoen Voir le message
    En faite, c'est une blacklist si un mot se retrouve dans le texte je dois le signaler a mon utilisateur car il est interdit.
    Dans ce cas là, tu charges ton XML dans un XmlDocument, tu loades toutes les valeurs dans une liste de string (List<string>) et après, tu te fais une petite méthode de vérification que tu appelles à chaque fois:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private bool CheckWord(string s)
    {
        bool result = false;
     
        // BlackList est la liste générique qui contient tes mots interdits
        if(BlackList.Contains(s))
        {
             result = true;
        }
     
        return result;
    }

  6. #6
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Citation Envoyé par Thomas Lebrun Voir le message
    Dans ce cas là, tu charges ton XML dans un XmlDocument, tu loades toutes les valeurs dans une liste de string (List<string>) et après, tu te fais une petite méthode de vérification que tu appelles à chaque fois:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private bool CheckWord(string s)
    {
        bool result = false;
     
        // BlackList est la liste générique qui contient tes mots interdits
        if(BlackList.Contains(s))
        {
             result = true;
        }
     
        return result;
    }
    +1
    j'ai pas plus simple
    et j'ai pas plus rapide

    Edit : Je viens de me rendre compte que l'on pouvait mal interpréter ce que j'ai dit, alors j'ai modifie

  7. #7
    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
    Plus simple il y a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private bool CheckWord(string s)
    {
      return BlackList.Contains(s);
    }
    Plus clair à mon goût

  8. #8
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 42
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Plus simple il y a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private bool CheckWord(string s)
    {
      return BlackList.Contains(s);
    }
    Plus clair à mon goût
    +1
    Je suis d'accord, c'est plus élégant!

  9. #9
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Plus simple il y a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private bool CheckWord(string s)
    {
      return BlackList.Contains(s);
    }
    Plus clair à mon goût
    La même chose pour moi.
    Je ne disais pas que ce n'était pas assez simple (voir mon edit)

  10. #10
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Citation Envoyé par professeur Voir le message
    +1
    Je suis d'accord, c'est plus élégant!
    Le code de Thomas Lebrun est a mon avis plus proche de la bonne façon de programmer que le raccourci proposé par Guulh

  11. #11
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    On ne va pas démarrer un débat philosophique, c'est la même fonction utilisée, peu importe qu'on stocke le retour dans une variable. De toute façon, au final, il y a 90% de chances que le MSIL soit identique.

  12. #12
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    On ne va pas démarrer un débat philosophique, c'est la même fonction utilisée, peu importe qu'on stocke le retour dans une variable. De toute façon, au final, il y a 90% de chances que le MSIL soit identique.
    Je vois que l'on anticipe les hors sujet sur le forum maintenant

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 159
    Points : 77
    Points
    77
    Par défaut
    Merci à tous pour votre aide et vos solutions.

    Bonne journée et au plaisir.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 159
    Points : 77
    Points
    77
    Par défaut
    Encore une dernière question si je dois controler les Nom, prénom de personne j'ai meilleur temps de faire une grosse liste ou d'en faire une pour chaque lettre de l'alphabète?

    Il y a environ 10 a 20 personne par lettre?

    Merci

  15. #15
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Citation Envoyé par totoen Voir le message
    Encore une dernière question si je dois controler les Nom, prénom de personne j'ai meilleur temps de faire une grosse liste ou d'en faire une pour chaque lettre de l'alphabète?

    Il y a environ 10 a 20 personne par lettre?

    Merci
    Pas compris

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 159
    Points : 77
    Points
    77
    Par défaut
    La question étais es-ce que je fait différente liste pour chaque lettre:

    T:
    Tartempion Julien
    Theodore Alfred

    P:
    Perret André
    Perrenoud Jean-Paul


    Mais je vais faire une liste générale c'est le plus simple. Et vu que j'ai pas 2milliers de personne ca devrait pas faire beaucoup de différence.

    Maintenant j'ai encore une autre question pour charger ma liste de string je fait:

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    List<string> Nom = new List<string>();
     
    XmlNodeList XmlListNom = MonFichierXML.selectnodes("/Root/Item");
     
    for (int i = 0; i < XmlListNom.count; i++)
     {
                    Nom.Add(XmlListNom[i].InnerText);
      }

    Y a t'il un meilleur moyen ou c'est l'optimum?

    Merci

  17. #17
    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
    Effectivement, si ta liste n'est pas trop grande, cette façon de faire suffit. Pour de plus grands volumes de données, il faut se diriger vers un conteneur associatif, comme les dictionnaires ou le HashSet présent dans le dernier framework.

    Pour répondre à ta dernière question : cette façon de faire est très bien, tu peux juste profiter du mot-clé foreach pour simplifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    foreach(XmlNode node in XmlListNom)
      Nom.Add(node.InnerText);
    Plus intuitif et permet d'éviter dans ton code l'introduction d'une variable inutile.

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 159
    Points : 77
    Points
    77
    Par défaut
    Merci pour ta solution.

    ++

  19. #19
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Petite info qui peut servir au passage. La méthode Contains, sur une liste de chaînes de caractères, est sensible à la casse. Cela dépend de la culture en cours pour être plus précis et il y a 99% de chance que cela soit ton cas

    Pense à ajouter les éléments avec un ToUpper() ou ToLower() et fait de même pour la recherche. Ca t'évitera d'avoir de faux négatifs, sauf si la casse doit être prise en compte dans ce que tu veux ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach(XmlNode node in XmlListNom)
    {
        Nom.Add(node.InnerText.ToLower());
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (Nom.Contains(s.ToLower()))
    {
        ...
    }
    Les caractères accentués poseront le même problème, il faudra les supprimer le cas échéant

    Une façon de faire pour supprimer les accents
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string str = "àâäéèêëîïôöùûü";
    byte[] tab = System.Text.Encoding.GetEncoding(1251).GetBytes(str);
    string result = System.Text.Encoding.ASCII.GetString(tab);

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 159
    Points : 77
    Points
    77
    Par défaut
    >>StormimOn : Merci pour l'astuce, mais moi j'ai de la chance ca doit être totalement indentique.

    Pour ceux que sa pourrait intéressé j'arrive à ce code:

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    TabBem.TabBem WsTabBem = new TabBem.TabBem();
    List<string> Nom = new List<string>();
    XmlDocument MonFichierXML = new XmlDocument();
    MonFichierXML.LoadXml(WsTabBem.getBad("170","5").OuterXml);
    XmlNodeList XmlListNom = MonFichierXML.SelectNodes("/Root/Item");
     
    foreach (XmlNode node in XmlListNom)
    Nom.Add(node.InnerText);
     
    string NametoControl="Hello how are you";
     
    List<string> ParttoTest = new List<string>();
    int Leave=0;
     
    while (Leave == 0)
    {
       int Pos = NametoControl.IndexOf(" ");
       if(Pos==-1)
       {
          if (NametoControl.Length > 1)
          {
             ParttoTest.Add(NametoControl);
          }
          Leave= 1;
        }
        else
        {
          ParttoTest.Add(NametoControl.Substring(0, Pos));
          NametoControl = NametoControl.Substring(Pos+1);
        }
    }
    string Error="";
    foreach (string str in ParttoTest)
    {
        if (Nom.Contains(str))
        { 
            Error = str;
        }
    }
     
    if (Error != "")
    {
        MessageBox.Show("The following Word is Unexpected:" + Error, "HR-Net", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }

    Es-ce que quelqu'un à une remarque a propos de mon code?

    Merci

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

Discussions similaires

  1. Tester si un chaîne est contenue dans une autre
    Par JonathanF dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 03/10/2011, 20h59
  2. Réponses: 2
    Dernier message: 28/03/2009, 19h13
  3. Réponses: 4
    Dernier message: 21/03/2008, 15h07
  4. [RegEx] Rechercher si mot est contenu dans un autre
    Par Seb33300 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 24/08/2007, 23h52
  5. [C#]Fonction vérifiant qu'1 string est contenue ds 1 autre
    Par closo dans le forum Windows Forms
    Réponses: 3
    Dernier message: 30/06/2005, 13h41

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