String contains() [Résolu]

theflayer 125 Messages postés dimanche 28 février 2010Date d'inscription 21 juin 2015 Dernière intervention - 23 mai 2012 à 10:49 - Dernière réponse : cs_L0ci 224 Messages postés vendredi 26 novembre 2010Date d'inscription 11 juin 2013 Dernière intervention
- 23 mai 2012 à 12:10
Salut tout le monde,

petite question,
j'ai un fichier texte avec une liste d'utilisateur sous cette forme :

Id : j.dupond
Prenom : Jean
Nom : Dupond

et pour récupérer les informations de l'utilisateur je fais comme ceci :

            string[] tab = File.ReadAllLines(path);
            long nb = CountLines(path); // compte le nombre de ligne du txt

            for (int i = 0; i < nb - 1; i++)
            {
                if (tab[i].ToLower().Contains(value.ToString().ToLower()))
                {
                    user = i.ToString();
                }
            }


le problème c'est que imaginons je recherche j.dupond, dans certain cas il me renvoi la ligne Nom : Dupond au lieu de la ligne Id: j.dupond, je voulais donc savoir si il n'y aurais pas un moyen de rendre Contains() plus précis, pour lui indiquer par exemple de ne récupérer la ligne contenant le mot exacte.
Voila j’espère avoir été explicite.

Je vous remercie d'avance.

-La constante d'une personne est la variable d'une autre.
-Il y a deux manières d'écrire des programmes sans erreurs. Seule la troisième marche
-Tout programme a (au moins) deux buts : celui pour lequel il a été écrit, et celui pour lequel il ne l'a pas été
Afficher la suite 

4 réponses

Répondre au sujet
theflayer 125 Messages postés dimanche 28 février 2010Date d'inscription 21 juin 2015 Dernière intervention - 23 mai 2012 à 10:57
+3
Utile
Idée de génie

Bon je pense qu'il doit y avoir mieux donc je suis toujours partant pour une répons mais sinon j'ai utilisé le titre de la ligne pour résoudre mon problème.
si ça peut servir :

            Form1 index = (Form1)this.Owner;
            Object value = index.value_cell();

            int col = index.value_col();
            int tare = 0;
            string path = @"D:\data.txt";
            string user = "";
            string seek = "";

            if (col == 0)
            {
                tare = 0;
                seek = "id : ";

            }
            else if (col == 1)
            {
                tare = 1;
                seek = "prenom : ";
            }
            else if (col == 2)
            {
                tare = 2;
                seek = "nom : ";
            }

            string[] tab = File.ReadAllLines(path);
            long nb = CountLines(path);

            for (int i = 0; i < nb - 1; i++)
            {
                if (tab[i].ToLower().Contains(seek + value.ToString().ToLower()))
                {
                    user = i.ToString();
                }
            }

            prenom.Text = tab[Convert.ToInt32(user) + 1 - tare].Substring(9);
            nom.Text = tab[Convert.ToInt32(user) + 2 - tare].Substring(6);
            id.Text = tab[Convert.ToInt32(user) - tare].Substring(5);


voila, ça a l'air de fonctionner.
Merci.

-La constante d'une personne est la variable d'une autre.
-Il y a deux manières d'écrire des programmes sans erreurs. Seule la troisième marche
-Tout programme a (au moins) deux buts : celui pour lequel il a été écrit, et celui pour lequel il ne l'a pas
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de theflayer
cs_L0ci 224 Messages postés vendredi 26 novembre 2010Date d'inscription 11 juin 2013 Dernière intervention - 23 mai 2012 à 11:07
+3
Utile
Bonjour,

Tu peux utiliser une regex pour trouver ca que tu cherches:

String line = tab[i].ToLower();
String search = value.ToString().ToLower();
if(Regex.IsMatch(line, @"\b" + search + "\b")){}

Je n'ai pas test mais ca devrait ressemble a quelque chose comme ça.

Sinon en utilisant Contains(), tu peux détourner le résultat en faisant:
if (tab[i].ToLower().Contains(" : " + value.ToString().ToLower())){}
Mais le fonctionnement n'est pas garanti sachant qu'il n'y a pas de caractère de fin de ligne et qu'il faut a chaque fois chercher la chaine exacte (ou du moins le début de chaîne exact).
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_L0ci
theflayer 125 Messages postés dimanche 28 février 2010Date d'inscription 21 juin 2015 Dernière intervention - 23 mai 2012 à 11:19
0
Utile
Salut L0ci ,

merci de ta réponse , c'est vrai que les regex sont surment plus adaptées, mais je crois que je suis allergique , chaque fois que j'essaye c'est aspirine garantie.
Bonne journée

-La constante d'une personne est la variable d'une autre.
-Il y a deux manières d'écrire des programmes sans erreurs. Seule la troisième marche
-Tout programme a (au moins) deux buts : celui pour lequel il a été écrit, et celui pour lequel il ne l'a pas
Commenter la réponse de theflayer
cs_L0ci 224 Messages postés vendredi 26 novembre 2010Date d'inscription 11 juin 2013 Dernière intervention - 23 mai 2012 à 12:10
0
Utile
Salut theflayer,

Je suis pas un grand fan des regex non plus même si ça marche bien .
Pour ta solution le problème va apparaître si tu as un utilisateur qui s'appelle Martin et un autre Martine. Si tu cherches martin les 2 résultats correspondront a la recherche.

Une solution serait de transformer user en liste pour afficher tout les résultats retournés.
Commenter la réponse de cs_L0ci

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.