Propriétés 'Left' et 'Right' [Résolu]

Signaler
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007
-
salamprc
Messages postés
2
Date d'inscription
mardi 2 mai 2006
Statut
Membre
Dernière intervention
9 juillet 2008
-
Salut à tous,

J'ai un problème avec les propriétés 'Left' et 'Right' que je sais coder en VB, mais pas moyen de trouver la syntaxe C#. Mon coded est le suivant :

for each  motRejete
in rejetsDim x As Integer

Dim ok As Boolean

ok =

true

while (ok)x = InStr(1,

" " & chaîne &
" ",
" " & motRejete &
" ");

if (x > 0) Thenchaîne = Left(chaîne, x - 1) & Right(chaîne, chaîne.Length - x - motRejete.Length + 1) /*C'est donc sur cette ligne que ce situe mes soucis avec 'left' et 'right'*/

elseok =

false

end if

wend

Est-ce que quelqu'un saurait comment coder ceci en c#?
Merci

_________________________________________________________________________
Woot
Alias Wouter Tjon.

13 réponses

Messages postés
129
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
30 décembre 2007
3
- Le 'x' de ton code, qui représente la position du mot dans la chaîne, correspond à 'index' dans le mien. En y repensant, je conviens que ce n'était pas très judicieux de ma part de changer le nom des variables, mais il se trouve que j'ai l'habitude, quand j'utilise IndexOf(), d'appeler la variable 'index'.

- 's' est simplement une chaîne de caractères quelconque, ce morceau-là c'était pour t'illustrer le fonctionnement de Substring() et d'IndexOf().

- Effectivement,
<hr />chaine = chaine.Substring(0, x) + chaine.Substring(x + motRejete.Length);<hr />
est censée faire exactement la même chose que
<hr />chaine = Left(chaine, x - 1) & Right(chaine, chaine.Length - x - motRejete.Length + 1)<hr />

En effet, chaine.Substring(0, x) retourne le morceau de la chaîne compris entre le premier caractère et le caractère à la position x (non-inclus), et chaine.Substring(x + motRejete.Length) retourne le morceau de la chaîne compris entre le caractère à la position x + motRejete.Length et la fin de la chaîne.

La version suivante de mon code est peut-être plus simple à comprendre pour toi, car elle est plus proche de la version VB :
<hr />foreach (string motRejete in rejets)
{
   bool ok = true;
   int x = 0;
   while (ok)
   {
      x = chaine.IndexOf(motRejete);
      if (x > -1)
      {
         chaine = chaine.Substring(0, x) + chaine.Substring(x + motRejete.Length);
      }
      else
      {
         ok = false;
      }
   }
}<hr />
Dans ma première réponse, j'avais utilisé une syntaxe beaucoup plus concise, habituelle pour ceux qui codent en C++/C#/Java, mais peut-être déroutante pour les utilisateurs de VB... Mea maxima culpa.

Si ça peut te rassurer, j'ai déjà essayé de transposer du code que j'avais écrit en C# vers du VB.NET et je n'ai guère mieux réussi que toi !
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

Ah oui, j'oubliais, j'ai aussi un problème de traduction à cause du 'InStr', je ne sais pas comment convertir ce int en string.
Merci

_________________________________________________________________________
Woot
Alias Wouter Tjon.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
44
Salut,
Je crois que C# n'a pas d'équivalent direct pour les méthodes Left et Right. Tu es obligé d'utiliser la méthode SubString.
C'est un peu plus long à faire, mais quelques lignes font l'affaire.

<hr size= "2" /> VC# forever
=13319
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
44
Pour ce qui est de InStr, ça correspond assez bien à la méthode IndexOf (de la class String donc bien sûr)
Enfin, d'après ce que j'ai pu lire dans la doc en tout cas...

<hr size= "2" /> VC# forever
=13319
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

Salut Bidou,
Ecoute, je n'arrive pas à mettre en oeuvre ce que tu me propose pour 'leftt' et 'right'.
Merci de m'en dire plus.

_________________________________________________________________________
Woot
Alias Wouter Tjon.
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

Je crois que l'on ne ce comprend pas bien, le 'InStr' a pour but de convertir le int 'x' en une 'string', si c'est ce que tu as voulu montrer, j'en suis alors désolé car j'ai pas compris.

_________________________________________________________________________
Woot
Alias Wouter Tjon.
Messages postés
129
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
30 décembre 2007
3
Salut,

En C#, tu peux utiliser la méthode Substring du type String pour mimer l'action de Left et Right :
<hr />string s = "that is a test";
string leftPart = s.Substring(0, 8);   // les 8 premiers caractères de la chaîne
string rightPart = s.Substring(8);   // tout ce qui reste après le 8ème caractère<hr />
Pour InStr, tu peux utiliser la méthode IndexOf() :<hr />int index s.IndexOf("is");   // index 5<hr />
Donc un moyen de traduire ton code en C# est de faire quelque chose comme :
<hr />foreach (string motRejete in rejets)
{
   int index = 0;
   while ((index = chaine.IndexOf(motRejete)) > 0)
   {
      chaine = chaine.Substring(0, index) + chaine.Substring(index + motRejete.Length);
   }
}<hr />
Note qu'un moyen plus simple et sans doute plus efficace consiste à passer par un StringBuilder :
<hr />StringBuilder sb = new StringBuilder(chaine);
foreach (string motRejete in rejets)
{
   sb.Replace(motRejete, String.Empty);   // remplacer motRejete par une chaîne vide
}
chaine = sb.toString();
<hr />
Messages postés
129
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
30 décembre 2007
3
InStr ne convertit rien, elle renvoie simplement la position d'une chaine de caractères au sein d'une autre. C'est exactement ce que fait String.IndexOf().

Au passage, il y a une coquille dans le code que je t'ai donné ci-dessus : IndexOf renvoie -1 si elle ne trouve pas d'occurence, donc dans la condition du while, il faut tester index > -1 et non index > 0.
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

Salut  dgouttegattat,
Je suis désolé mais je ne comprend rien à ton exemple, cela a-t-il encor quelque chose à voir avec le code d'origine, ou c'est juste un exemple comme ça?

_________________________________________________________________________
Woot
Alias Wouter Tjon.
Messages postés
129
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
30 décembre 2007
3
Je reconnais que ça ne ressemble plus du tout à ton code, mais pourtant il doit faire exactement la même chose. À moins que je n'ai pas compris ton code dès le départ ? Ce ne serait pas très étonnant vu mon niveau en VB...

Pour être sûr, voilà ce que j'ai compris : tu veux supprimer d'une chaîne de caractères tous les mots qui sont présents dans une liste de "mots à rejeter".
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

Oui exact!
Mais en faite ce que je ne comprend pas dans ton exemple sont les points suivants :
-Où est passé mon 'x'?
-Que représente ton 's'(string')?
-Ta ligne : (chaine = chaine.Substring(0, index) 
  +chaine.Substring(index + motRejete.Length);),
    fait elle la même chose que ça : chaîne = Left(chaîne, x - 1) & Right(chaîne,     chaîne.Length - x - motRejete.Length + 1)  ?
-Et pour finir,  ben tu auras remarqué que je n'ais en faite rien compris...

_________________________________________________________________________
Woot
Alias Wouter Tjon.
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

Alors là, que dire à par MERCI dgouttegattat !!!
Explications très claire, compréhensible...Niquel quoi.
Merci de m'avoir enlever cette épine qui me faisait F**t*****t mal.

_________________________________________________________________________
Woot
Alias Wouter Tjon.
Messages postés
2
Date d'inscription
mardi 2 mai 2006
Statut
Membre
Dernière intervention
9 juillet 2008

En fait les fonction Left, Right, Mid peuvent être utiliser dans C# sans les implenter de nouveau.
on  ajoute  l'entête : using Microsoft.VisualBasic ;
puis pour les opérations sur les chaînes de caractères on utilise Strings.<Membre> avec Membre un des membres de la classe Strings (Left, Right, Trim, Mid...).

un petit exemple d'essai:

using System
;
using Microsoft.VisualBasic;

class Program
{
static
void Main(
string[] args)

{
   Console
.WriteLine(Strings.Right("TestMidTestRight", 9));
   Console.WriteLine(Strings.Left("Left.TestMidTest", 8));

   Console.WriteLine(Strings.Mid("LeftTest.MidTest",7));

}
}

Bonne continuation.